【发布时间】:2019-09-03 15:34:08
【问题描述】:
我有一个可选的整数列表,
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;
}
非常感谢任何和所有帮助!
【问题讨论】:
-
这里不需要 Java8 和 Optionals。只需使用 for 循环并执行此操作。 Java8 不是解决所有问题的灵丹妙药。
-
Optional一般不推荐用于参数。如果调用者仅在他们真正想要完成过滤时调用filter,它将为您提供更清晰的界面。调用者可以做类似filteredList = ids.map(this::filter).orElse(people);.
标签: java java-stream optional