Unnecessary control flow statements may be misleading in some contexts.
For instance, this method to find groups of prime order has a bug:
static ImmutableList<Group> filterGroupsOfPrimeOrder(Iterable<Group> groups) { ImmutableList.Builder<Group> filtered = ImmutableList.builder(); for (Group group : groups) { for (int i = 2; i < group.order(); i++) { if (group.order() % i == 0) { continue; } } filtered.add(group); } return filtered.build(); }
The continue
statement only breaks out of the innermost loop, so the input is returned unchanged.
The most readable alternative is probably to avoid a nested loop entirely:
static ImmutableList<Group> filterGroupsOfPrimeOrder(Iterable<Group> groups) { ImmutableList.Builder<Group> filtered = ImmutableList.builder(); for (Group group : groups) { if (!isPrime(group.order())) { continue; } filtered.add(group); } return filtered.build(); }
A labelled break statement would also be correct, but is quite uncommon:
static ImmutableList<Group> filterGroupsOfPrimeOrder(Iterable<Group> groups) { ImmutableList.Builder<Group> filtered = ImmutableList.builder(); outer: for (Group group : groups) { for (int i = 2; i < group.order(); i++) { if (group.order() % i == 0) { continue outer; } } filtered.add(group); } return filtered.build(); }