我有一个包含多个列表的对象。因此,我遍历了地图。一物三表。使用地图遍历,最后首先使用查找。是否可以使用单个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();
请帮助
代替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();
使用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版本。