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
这些整数满足所有过滤条件。
我有一个如下所示的对象
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
这些整数满足所有过滤条件。