Reputation: 5122
Could you tell me if there are other loop expressions which Java programmer must be able to read?
final List<String> names = Arrays.asList("Alice", "Bob", "Carol", "Dave", "Eve");
System.out.println("Pattern 1:");
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}
System.out.println("Pattern 2:");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("Pattern 3:");
for (String name : names) {
System.out.println(name);
}
System.out.println("Pattern 4:");
names.forEach(new Consumer<String>() {
@Override
public void accept(String name) {
System.out.println(name);
}
});
System.out.println("Pattern 5:");
names.forEach((String name) -> {System.out.println(name);});
System.out.println("Pattern 6:");
names.forEach((String name) -> System.out.println(name));
System.out.println("Pattern 7:");
names.forEach(name -> System.out.println(name));
System.out.println("Pattern 8:");
names.forEach(System.out::println);
System.out.println("Pattern 9:");
names.stream().forEach(System.out::println);
Upvotes: 0
Views: 476
Reputation: 6133
Some more possibilities:
System.out.println("Pattern 12:");
IntStream.range(0, names.size())
.mapToObj(i -> names.get(i))
.forEach(System.out::println);
System.out.println("Pattern 13:");
Stream.generate(names.iterator()::next)
.limit(names.size())
.forEach(System.out::println);
But, rather than simply listing all of the looping patterns you can think of, it would be more useful to categorize them and think about the use cases for each one. As a start, I suggest these categories:
Indexed loops, e.g. patterns 1, 12
Non-indexed, breakable loops, e.g. patterns 2, 3
Non-indexed, non-breakable loops, e.g. patterns 4, 9, 13:
takeWhile
method.Upvotes: 1
Reputation: 324
You can use an iterator in a for loop:
for(Iterator<String> nameIterator = names.iterator(); nameIterator.hasNext(); ) {
System.out.println(nameIterator.next());
}
Upvotes: 1
Reputation: 344
Also we have,
names.stream().forEachOrdered(System.out::println);
forEachOrdered
should be used instead of forEach
because the behaviour of forEach
is non-deterministic, but forEachOrdered
performs the operations in the order defined in the stream, provided if you have defined an order in the stream
Also also, you have parallelStream
, which can print the list irrespective of order,
names.parallelStream().forEach(System.out::println);
Alternatively you can also do, removing the first element after printing the list, you can do the same with iterators too, using iterator.previous
method too.
while(!names.empty()){
SOP(names.get(0));
names = names.subList(1,names.size());
}
Upvotes: 2
Reputation: 44854
Java 11
System.out.println("Pattern 11:");
names.forEach((var name) -> System.out.println(name));
Upvotes: 1