从 Java 中的可选>列表>列表转换的链方法

2022-09-04 07:31:46

我有一个包含列表的对象。我想将此列表中的每个对象映射到另一个列表,并返回结果列表。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


答案 1

没有。 如果 是 将一个可能扁平化为 .所以这是正确的。flatMapOptionalOptional<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());
}

答案 2

Java 9 方法将是愚蠢的:

public List<Bar> get(Optional<Foo> foo) {
         return foo.map(Foo::getBazList)
                   .stream()
                   .flatMap(Collection::stream)
                   .map(Baz::getBar)
                   .collect(Collectors.toList());
}

也就是说,您应该避免使用s作为参数,请参阅此处Optional


推荐