【发布时间】:2017-07-13 08:07:33
【问题描述】:
我有 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;
}
这行得通,但它并不懒惰。有什么想法吗?
【问题讨论】:
-
如果我错了,请纠正我,但我认为如果将列表调用包装在 lambdas 中会很懒惰。在
firstNonEmptyList中,您将评估每个 lambda,直到找到您想要的那个(即返回非空列表的那个)。未被调用的 lambda 永远不会执行查询。无论如何,shmosel 提供的解决方案符合我的描述并且更加优雅。
标签: java list lambda lazy-loading