Phash
Phash

Reputation: 428

How to return the result of an inner method in cascaded streams

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

Answers (1)

John Kugelman
John Kugelman

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

Related Questions