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

时间:2018-06-13 20:16:41

标签: java java-8 java-stream optional

我有一个包含列表的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可能是解决方案,但我无法在此处弄清楚如何使用它。

2 个答案:

答案 0 :(得分:12)

没有。在flatMap的情况下OptionalOptional<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