web-dev-qa-db-ja.com

JavaのOptional-> List-> Listから変換するチェーンメソッド

リストを含む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が解決策になると思いますが、ここではそれを使用する方法を理解できません。

12
Jordan Mackie

ありません。 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());
}
12
Eugene

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());
}

つまり、Optionalsをパラメーターとして使用することは避けてください こちらをご覧ください

9
Aomine