Java 8 根据列表部分的条件过滤列表

标签 java collections java-8 java-stream

我有一个对象列表 N,其中 N 是

N
|--- type (1,2,3)
|--- A (applicable if type 1)
|--- B (applicable if type 2)
|--- C (applicable if type 3)
|--- List<Integer> p 

现在,我想要的结果是 List 的过滤版本:

create a list List<Integer> l

首先执行此操作:

if(type == 1) && (A > some_value):
  Add all elements of p to l
  select this N

稍后,L 形成后:

if(type != 1)
  if(l contains any element from p):
    select this N

如何使用流一步实现这一目标?

我可以先过滤并创建一个列表“l”,然后使用该列表进行过滤。

l = stream.filter(a -> a.type == 1 && a.A > some_value).collect(..)

然后,使用 l 进一步过滤。

但是有没有更好、更精确的方法呢?

最佳答案

if(type == 1) && (A > some_value):
  Add all elements of p to l
  select this N

不知道“选择此 N”在这里意味着什么,因为您选择的是 p 值,所以我忽略了该行。

Set<Integer> set = listOfN.stream()
    .filter(n -> n.type == 1 && n.A > some_value)
    .flatMap(n -> n.p.stream())
    .collect(Collectors.toSet());

为了提高下一步 ( contains() ) 的性能,结果从 List 更改为 Set

if(type != 1)
  if(l contains any element from p):
    select this N
List<N> result = listOfN.stream()
    .filter(n -> n.type != 1 && n.p.stream().anyMatch(set::contains))
    .collect(Collectors.toList());

关于Java 8 根据列表部分的条件过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56369807/

相关文章:

java - 不使用注释的最佳 XML 生成器

java - 如何将 ArrayList 添加到 ArrayList?

java - Java 8 流过滤器对收集方法的优化程度如何?

java - 在同一台机器上安装多个版本的ant

java - 使用参数化流跟踪迭代

java - 如何在 Java 8 中并行读取文件的所有行

java - 从导入的电子表格数据的字符串数组中获取特定 'elements' 的最简单方法?

java - Tomcat连接池方法

java - @JsonValue 在枚举字段上,当此枚举用作映射键时

java - 从数据库中获取特定列的最新行