我有三个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
}
任何有关如何有效执行操作的想法?
答案 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