Reputation: 428
How can I reduce the following statements using Java Stream API?
String code = "searchcode";
Inner result;
for (Outer outer : outerList) {
for (Middle middle : outer.getMiddleList()) {
Inner inner = middle.getResultForCode(code);
if (inner != null) {
result = inner;
}
}
}
I want to get "inner" or "inner.getRelevantThing()"
something like:
Optional<Inner> result = outerList.forEach(middle ->
middle.stream()
.filter(middle.getResultForCode(code))
.findFirst());
Upvotes: 1
Views: 487
Reputation: 361909
You can use flatMap
to flatten nested streams.
Optional<Inner> result = outerList.stream()
.flatMap(outer -> outer.getMiddleList().stream())
.map(middle -> middle.getResultForCode(code))
.filter(Objects::nonNull)
.findAny();
(Note that findAny
will find any matching item, not the last matching item as your code did.)
If you want the "relevant thing", you can apply a mapping to the Optional<Inner>
.
outerList.stream()
.flatMap(outer -> outer.getMiddleList().stream())
.map(middle -> middle.getResultForCode(code))
.filter(Objects::nonNull)
.findAny()
.map(Inner::getRelevantThing);
Upvotes: 3