リストを含む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
が解決策になると思いますが、ここではそれを使用する方法を理解できません。
ありません。 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());
}
A 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
sをパラメーターとして使用することは避けてください こちらをご覧ください 。