By definition foreach loop requires an Iterable to be passed in.
It can be achieved with anonymous class:
for (String s : new Iterable<String>() {
@Override
public Iterator<String> iterator() {
return stream.iterator();
}
}) {
writer.append(s);
}
This can be simplified with lambda because Iterable
is a functional interface:
for (String s : (Iterable<String>) () -> stream.iterator()) {
writer.append(s);
}
This can be converted to method reference:
for (String s : (Iterable<String>) stream::iterator) {
writer.append(s);
}
Explicit cast can be avoided with intermediate variable or method param:
Iterable<String> iterable = stream::iterator;
for (String s : iterable) {
writer.append(s);
}
There is also StreamEx library in maven central that features iterable streams and other perks out of the box.
Here are some most popular questions and approaches that provide workarounds on checked exception handling within lambdas and streams:
Java 8 Lambda function that throws exception?
Java 8: Lambda-Streams, Filter by Method with Exception
How can I throw CHECKED exceptions from inside Java 8 streams?
Java 8: Mandatory checked exceptions handling in lambda expressions. Why mandatory, not optional?
jOOλ Unchecked
Lombok @SneakyThrows
Kotlin 😉