在Java中从Optional-> List-> List转换的链方法

Jor*_*kie 12 java optional java-8 java-stream

我有一个Optional包含列表的对象.我想将此列表中的每个对象映射到另一个列表,并返回结果列表.

那是:

public List<Bar> get(int id) {
    Optional<Foo> optfoo = dao.getById(id);
    return optfoo.map(foo -> foo.getBazList.stream().map(baz -> baz.getBar()))
}
Run Code Online (Sandbox Code Playgroud)

如果没有溪流内的溪流,有没有一种干净的方式呢?

我认为这flatMap可能是解决方案,但我无法弄清楚如何在这里使用它.

Eug*_*ene 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());
}
Run Code Online (Sandbox Code Playgroud)

  • `.map(baz - > baz.getBar())`应该可以替换为`.map(Baz :: getBar)` (3认同)
  • @Turing85当然,这只是一个例子.但是`toList`也没有对返回的`List`做出任何保证.一个更有趣的`List.of(...)`.`list.contains(空)`. (2认同)

Ous*_* D. 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());
}
Run Code Online (Sandbox Code Playgroud)

也就是说,你应该避免使用Optionals作为参数,请参见此处.

  • 为什么不将`Optional.stream()`移到前面?`return foo.stream().flattMap(f - > f.getBazList().stream()).map(Baz :: getBar).collect(Collectors.toList());` (2认同)