java - 根据可选列表过滤列表

标签 java java-stream option-type

我有一个可选的整数列表, 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/

相关文章:

java - Appengine MemCache 在多次运行中重置

java - "error: incompatible types: inference variable R has incompatible bounds"单行flatMap流

java - 如何从包含数组的数组中删除空值

swift - 同时初始化和绑定(bind)swift可选成员?

swift - 尝试在 View Controller 之外使用 TextView 时出错

Java可选接口(interface): Nested conditions on Optional object chain

java - 我如何分离 <xsd :choice/> sub-elements into individual Collection properties using JAXB?

java - 如何为相同的按钮制作 Action 命令

java - 完全迭代 HashMap 一次,不重复

Java流findAny()在filter()操作过滤掉所有内容后遇到空指针异常