我有一个可选的整数列表,
Optional<List<Integer>> id.
我有很多不同的人的名单。 List<People> people.
我有一个采用可选过滤器的过滤器方法。该代码调用存储库以获取人员列表,如果填充了可选的 id 列表,则会根据 id 过滤列表中的人员。人们.getId()。
我想使用 steams API 来避免编辑原始列表。我试过这样的事情
return people.stream()
.filter(p -> !request.getId().orElseGet(ArrayList::new).contains(p.getId()))
.collect(Collectors.toList());
规范是。
- 如果没有id,则全部返回
- 如果提供了 id - 过滤器
- 如果提供了 id 但没有匹配,则返回空列表
当没有 id 匹配时,上面的方法失败,它返回一个完整的列表。
Optional<List<Integer>> ids = Optional.of(Arrays.asList(1, 2, 3));
List<People> people = datasource...
List<People> filter (Optional < List < Integer >>> ids) {
List<People> confusion = people.steam(). ?
return confusion;
}
非常感谢任何帮助!
最佳答案
if no id's, return all
首先,您只需要一个 ||
健康)状况。如果Optional
为空则 Optional.isPresent()
将是 false
, 所以添加一个 !ids.isPresent()
在 ||
之前会将 filter
中的所有项目归还给您作为 ||
||
左边的条件是短路操作是true
整个条件将是 true
.
if id's provided - filter
其次,!
需要从您的支票中删除并且您需要在 ||
右侧进行此检查: ids.get().contains(p.getId())
使用来自 Optional
的 ID 列表进行过滤.
if id's provided and no matches, return empty list
第三,如果ids
存在则第二次检查将被评估为第一次检查 !ids.isPresent()
变成 false
. People
如果 id
对象将被检查与 Optional
中的列表匹配如果没有匹配项,则返回一个空列表。
所以这三个都可以在下面应用:
List<People> list = people.stream()
.filter(p -> !ids.isPresent() || ( ids.get().isEmpty() || ids.get().contains(p.getId())))
.collect(Collectors.toList());
此外,如果您使用 Optional<Set<Integer>>
会更好而不是 Optional<List<Integer>>
, 然后 contains()
将是恒定时间操作。
关于java - 根据可选列表过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57774810/