Java Stream 过滤相同的字段但不同的标准

标签 java java-8 java-stream

我有一个 Person 类:

@Data
public class Person {
   private Integer id;
   private String status;
}

我有一个名为 personList 的人员列表:

[{ 
    "id": null,
    "status": "inactive"
 },
 { 
    "id": 2,
    "status": "inactive"
 },
 { 
    "id": null,
    "status": "active"
 }]

现在我需要找到所有状态为“不活跃”的人,无论此人是否有 ID。如果某人没有 Id,但状态为“活跃”,则也包括该人。我正在使用 Java 流进行过滤:

 List<Person> inactivePersonList = 
     personList.stream()
               .filter(person -> person.getStatus().equals("inactive"))
               .filter(person -> person.getId() == null && person.getStatus().equals("active"))
               .collect(Collectors.toList());

流式传输后的结果是没有人接听。第一个人因为没有通过第二个过滤器而没有被捡到,最后一个人因为没有通过第一个过滤器而没有被捡到。

我想我可以通过使用 OR 将两个过滤器组合成一个来修复它,但我试图让每个过滤器都简单,所以在我做出改变之前,我想问一下是否有是一种更好的方法。谢谢。

最佳答案

过滤器是附加的。它们有效地被 && 组合在一起。当您需要 || 时,长过滤器是不可避免的。

List<Person> inactivePersonList = 
    personList.stream()
              .filter(p -> p.getStatus().equals("inactive") ||
                           p.getId() == null && p.getStatus().equals("active"))
              .collect(Collectors.toList());

如果您有单独的 Predicate 对象,您可以将它们.or() 在一起。

Predicate<Person> inactive = p -> p.getStatus().equals("inactive");
Predicate<Person> activeUnknown = p -> p.getId() == null && p.getStatus().equals("active");

List<Person> inactivePersonList = 
    personList.stream()
              .filter(inactive.or(activeUnknown))
              .collect(Collectors.toList());

甚至:

Predicate<Person> inactive = p -> p.getStatus().equals("inactive");
Predicate<Person> unknown = p -> p.getId() == null;
Predicate<Person> active = p -> p.getStatus().equals("active");

List<Person> inactivePersonList = 
    personList.stream()
              .filter(inactive.or(unknown.and(active)))
              .collect(Collectors.toList());

关于Java Stream 过滤相同的字段但不同的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60550754/

相关文章:

Java 8 原始流到集合的映射方法

java - 如何使用流从列表中的另一个对象检索列表

java - 如何使项目仅在android中的语句 boolean 值时可见

multithreading - CopyOnWriteArrayList不能按预期工作

java - JDO/Datanucleus 错误 : Field "..." is declared as a reference type (interface/Object) but no implementation classes of "..." have been found?

java - RxJava1 和 RxJava2 的区别

java - Java 流上的聚合操作如何工作?

java - 使用 Java 8 流如何将 Map<String, List<Something>> 转换为 Map<String, Integer>?

java - 在 Java 中,如何将十进制数转换为基数 36?

java - java反射可以将不在java源文件中的方法添加到类文件中吗?