gpt4 book ai didi

java - 在 Java 8 中延迟返回第一个非空列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:32 36 4
gpt4 key购买 nike

我有 N 个从存储库返回数据的列表。我想返回这三个列表中的第一个非空列表(每个列表执行不同的 SQL 来获取数据)。

要注意的是我想懒惰地执行此操作,这样如果我已经找到可接受的结果就不需要在数据库上执行 SQL。我的代码是(修改)

@Override
public List<Something> dataService(Data data) {

return firstNonEmptyList(repository.getDataWayOne(data.getParameter()),
repository.getDataWayTwo(data.getParameter()),
repository.getDataWayThree(data.getParameter().getAcessoryParameter())
Collections.singletonList(repository.getDefaultData(data.getParameter()));

}

@SafeVarargs
private final List<Something> firstNonEmptyList(List<Something>... lists) {
for (List<Something> list : lists) {
if (!list.isEmpty()) {
return list;
}
}

return null;

}

这行得通,但并不懒惰。有什么想法吗?

最佳答案

您可以创建供应商流并按遇到的顺序评估它们,直到找到结果:

return Stream.<Supplier<List<Something>>>of(
() -> repository.getDataWayOne(data.getParameter()),
() -> repository.getDataWayTwo(data.getParameter()),
() -> repository.getDataWayThree(data.getParameter().getAcessoryParameter()),
() -> Collections.singletonList(repository.getDefaultData(data.getParameter()))
)
.map(Supplier::get)
.filter(l -> !l.isEmpty())
.findFirst()
.orElse(null);

每个供应商都定义了如何访问结果集,在执行 map() 之前不会实际尝试访问。因为 filter()map()stateless操作,将调用每个供应商并在尝试下一个供应商之前验证其结果。如果找到非空结果,流将立即终止,因为 findFirst()short-circuiting .

关于java - 在 Java 8 中延迟返回第一个非空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42405656/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com