当前位置: 首页 > 知识库问答 >
问题:

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

端木野
2023-03-14

我有个人课:

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

我有一个叫personList的人的名单:

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

现在我需要找到所有状态为“不活跃”的人,不管这个人是否有身份证。如果一个人没有身份证,但状态为“活跃”,也包括那个人。我正在使用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将两个过滤器合并成一个来修复它,但是我正在努力使每个过滤器变得简单,所以在我做出改变之前,我想问一下是否有更好的方法来做到这一点。谢谢。

共有2个答案

凌清夷
2023-03-14

使用一个筛选器,但向用户添加一个方法,例如isActive()

@Data
public class Person {
   private Integer id;
   private String status;
   public boolean isActive() {
       return status.equals("active") || id != null;
   }
}

你最好改变区分活跃用户的方式。如果用户处于“活动”状态,但同时未处于活动状态,则说明您的类设计出了问题。

您可能希望使用枚举状态{INACTIVE,ACTIVE}而不是字符串。

或者使用另一种方法isUnknown,使过滤器更清晰。对所有人进行多次迭代似乎不是一个好主意。

凌联
2023-03-14

过滤器是添加剂。它们实际上是

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

如果你有独立的谓词对象,你可以。或者()将它们放在一起。

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());

 类似资料:
  • 我正在使用普罗米修斯和格拉法纳,我正在试图跟踪一个web服务器应用程序。 我想以毫秒为单位绘制特定查询的平均持续时间。我想我可以从下面的数据到那里,但我在挣扎。 我的两组值: 但是分母可以有不同的返回码,所以我必须求和,我需要做一些忽略或on之类的事情,但我还没有找到一个例子来帮助我,我对此非常陌生。 有人吗?

  • 我有一个Kafka Streams拓扑,其中我加入了5个表,每个表都是在一个主题上创建的,该主题由一些Kafka连接器填充,这些连接器产生KeyValue事件,其中Key是针对相同的Avro模式产生的,但在我的拓扑中,当我加入这些表时,Key似乎不一样,如果它们是Java等于事件。所有这些背后的原因是什么? 它与Confluent Schema Registry集成。 我们已经使用了调试器,并且在

  • 我有一个算法,在一些不同的字符串之间给我一个分数。我的想法是:如果两个字符串之间的分数高于0'80,那么这两个字符串将被认为是相同的,当我应用keyby(“name”)时,那些相似的字符串将被键入,因为它们具有完全相同的名称。 直观示例: DataStream1-----约翰·洛克,米奇·米克,威尔·威廉姆斯 希望你能理解,谢谢!

  • 问题内容: 我今天在另一个问题中提出了这个问题,但是 由于措辞的方式,恐怕无法解决任何问题。 我有一个json输入,其中包含以下数据: 杰森 如您所见,option_value项是一个对象中的Array和 另一个对象中的简单字符串。 我怎样才能让Gson正确处理呢?我的类将此描述为 List对象,因此它适用于option_value是 数组的前几个项目,但是当它成为字符串时,应用程序崩溃,并且我收

  • null 或用java

  • 我有一张清单: 我想有这样的结果: