需要使用Java 8(Optional )

问题描述 投票:-1回答:2
在一个复杂对象中获取String

我有一个包含多个列表的对象。因此,我遍历了地图。一物三表。使用地图遍历,最后首先使用查找。是否可以使用单个Optional代替

Optional<Optional<Optional<String>>>

??

这是我尝试过的

Optional<Optional<Optional<String>>> myString = myComplexObject.stream()
                                .map( obj1 -> obj1.getObj2().stream()
                                          .map( obj2 -> obj2.getObj3().stream() 
                                                    .filter(obj3 -> obj3.getMyString() .equalsIgnoreCase("Name")) 
                                                    .map(obj3 -> obj3.getMyString())
                                                    .findFirst()) 
                                          .findFirst())
                                .findFirst();

请帮助

java java-8 optional
2个回答
1
投票

代替map(),使用flatMap()

myComplexObject.stream()
.flatMap(obj1 -> obj1.getObj2().stream()) // Stream of `obj2`
.flatMap(obj2 -> obj2.getObj3().stream()) // Stream of `obj3`
.map(obj3 -> obj3.getMyString())          // Stream of `string`
.filter(s -> s.equalsIgnoreCase("Name"))
.findFirst();             

0
投票

使用this answer作为基础,我们可以尝试:

Optional<String> myString = myComplexObject.stream()
        .map( obj1 -> obj1.getObj2().stream()
                .map( obj2 -> obj2.getObj3().stream()
                        .filter(obj3 -> obj3.getMyString().equalsIgnoreCase("Name"))
                        .map(Object3::getMyString)
                        .findFirst())
                .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
                .findFirst())
        .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
        .findFirst();

如果您可以使用Java 9,答案还提供了更干净的Java 9版本。

© www.soinside.com 2019 - 2024. All rights reserved.