Java 8 列表中list的流过滤值

Java 8 Stream filtering value of list in a list

我有一个如下所示的对象

class MyObject {

    String type;
    List<String> subTypes;

}

给定一个 MyObject 列表,是否可以使用 Java 8 个流来过滤类型和子类型?

到目前为止我有

myObjects.stream()
    .filter(t -> t.getType().equals(someotherType)
    .collect(Collections.toList());

但在此范围内,我还希望对子类型的 each 进行另一个筛选,也对特定子类型进行筛选。我不知道该怎么做。

一个例子是

myObject { type: A, subTypes [ { X, Y, Z } ] }
myObject { type: B, subTypes [ { W, X, Y } ] }
myObject { type: B, subTypes [ { W, X, Z } ] }
myObject { type: C, subTypes [ { W, X, Z } ] }

我会传入匹配类型 B 和子类型 Z,所以我希望得到一个结果 -> myObject 类型 B,子类型:W、X、Z

列表中当前 returns 2 项。

myObjects.stream()
    .filter(t -> t.getType().equals("B")
    .collect(Collectors.toList());

但我想在每个子类型上添加一个额外的过滤器,并且只匹配存在 'Z' 的地方。

你可以这样做:

myObjects.stream()
         .filter(t -> t.getType().equals(someotherType) && 
                      t.getSubTypes().stream().anyMatch(<predicate>))
         .collect(Collectors.toList());

这将获取

的所有 MyObject 个对象
  • 满足有关 type 成员的条件。
  • 包含嵌套 List<String> 中满足某些其他条件的对象,用 <predicate>
  • 表示

我看到了@kocko 接受的答案,这是一个很好的答案,而且完全正确。然而,有一种稍微替代的方法,您只需将过滤器链接起来。

final List<MyObject> withBZ = myObjects.stream()
        .filter(myObj -> myObj.getType().equals("B"))
        .filter(myObj -> myObj.getSubTypes().stream().anyMatch("Z"::equals))
        .collect(Collectors.toList());

这基本上是在做同样的事情,但是 && 操作数被删除,取而代之的是另一个过滤器。链接对于 Java 8 Stream API:s 和 IMO 来说非常有效,它更容易阅读和遵循代码。

我在这个网站上找到了一堆例子:https://zetcode.com/java/streamfilter/

引用示例 Java 流式多过滤操作

可以对一个流应用多个过滤操作。

package com.zetcode;

import java.util.Arrays;
import java.util.function.IntConsumer;

public class JavaStreamMultipleFilters {

public static void main(String[] args) {

    int[] inums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
    
    IntConsumer icons = i -> System.out.print(i + " ");
    
    Arrays.stream(inums).filter(e -> e < 6 || e > 10)
            .filter(e -> e % 2 == 0).forEach(icons);
}

}

在示例中,我们对整数流应用了多个过滤操作。

int[] inums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

我们有一个整数值数组。

IntConsumer icons = i -> System.out.print(i + " ");

IntConsumer 是一个接受单个整数值参数并且 returns 没有结果的操作。

Arrays.stream(inums).filter(e -> e < 6 || e > 10)
        .filter(e -> e % 2 == 0).forEach(icons);

流是使用 Arrays.stream 方法从数组创建的。进行了多次过滤操作。

2 4 12 14

这些整数满足所有过滤条件。