连接可选列表

时间:2019-03-15 15:52:10

标签: java java-8 optional

我有三个Optional>,它们必须组合起来并返回。我尝试使用Optional.map()flatmap(),但没有成功。

public Optional<List<Entiy>> getRecords() {
    Optional<List<Entiy>> entity1 = repo.findAllByStatus("1");
    Optional<List<Entiy>> entity2 = repo.findAllByStatus("2");
    Optional<List<Entiy>> entity3 = repo.findAllByStatus("3");
    //Need to return a concatenation of entity1, 2 and 3
}

任何有关如何有效执行操作的想法?

3 个答案:

答案 0 :(得分:3)

类似的东西:

return Optional.of(Stream.of(entity1.orElse(new ArrayList<>()), entity2.orElse(new ArrayList<>()), entity3.orElse(new ArrayList<>()))
            .flatMap(List::stream)
            .collect(Collectors.toList()));

或更容易理解为:

return Optional.of(Stream.of(entity1, entity2, entity3)
        .filter(Optional::isPresent)
        .map(Optional::get)
        .flatMap(List::stream)
        .collect(Collectors.toList()));

答案 1 :(得分:1)

使用流媒体时,它变得更容易:

return Stream.of(entity1, entity2, entity3)
        .filter(Optional::isPresent)
        .map(Optional::get)
        .flatMap(List::stream)
        .collect(Collectors.collectingAndThen(Collectors.toList(), Optional::of));

请注意,此可选选项永远不会为空。它将至少包含一个空列表,这违背了使用可选选项的目的。将Collection类型用作返回类型时,Optional并没有真正使用,因为建议返回一个 empty 集合,其中将使用一个空的可选内容。

因此,我将方法的返回类型更改为List,并在没有 present 可选输入项的情况下让流返回一个空列表。

答案 2 :(得分:1)

我建议您不要从您的方法中返回992。如果三个实体列表中的任何一个都没有记录,则呼叫者宁愿只拥有一个空列表。

Optional

另两个答案分别使用public List<Entity> getRecords() { return Stream.of("1", "2", "3") .map(repo::findAllByStatus) .flatMap(el -> el.map(List::stream).orElse(Stream.empty())) .collect(Collectors.toList()); } isPresent。它们是低级的,我们在这里不需要它们。

不过,我们并非绝对需要流操作。没有它,这是一种可能性:

get