我有一个包含列表的Optional
对象。我想将此列表中的每个对象映射到另一个列表,并返回结果列表。
那是:
public List<Bar> get(int id) {
Optional<Foo> optfoo = dao.getById(id);
return optfoo.map(foo -> foo.getBazList.stream().map(baz -> baz.getBar()))
}
如果没有流内的流,是否有一种干净的方法呢?
我认为flatMap
可能是解决方案,但我无法在此处弄清楚如何使用它。
答案 0 :(得分:12)
没有。在flatMap
的情况下Optional
将Optional<Optional<T>>
展平为Optional<T>
。所以这是正确的。
public List<Bar> get(Optional<Foo> foo) {
return foo.map(x -> x.getBazList()
.stream()
.map(Baz::getBar)
.collect(Collectors.toList()))
.orElse(Collections.emptyList());
}
答案 1 :(得分:9)
Java 9方法将成为下列方法:
public List<Bar> get(Optional<Foo> foo) {
return foo.map(Foo::getBazList)
.stream()
.flatMap(Collection::stream)
.map(Baz::getBar)
.collect(Collectors.toList());
}
也就是说,您应该避免使用Optional
作为参数see here。