java - 在java中按多个字段过滤的最佳方法是什么

标签 java java-8 java-stream

我有一个包含 10 个字段的实体:

Class Details{
  String item; 
  String name; 
  String type;
  String origin; 
  String color; 
  String quality;
  String country;
  String quantity;
  Boolean availability;
  String price;
 }

我有一个服务于列表的 Restful 端点。我希望用户能够为每个字段提供搜索过滤器。 目前我对每个字段都有 QueryParam。然后我使用 java8 流进行过滤:

List<Detail> details;
details.stream().filter(detail-> detail.getItem()==item).filter(detail-> detail.getName()==name).....collect(Collectors.toList());

如果我有 50 个包含多个字段的其他类要过滤,是否有一种概括方法?

最佳答案

你可以用 .and() 组成这样的谓词和 .or() ,允许您定义一个聚合谓词来应用您想要的所有检查,而不是尝试链接 n .filter() 调用。这使得可以在运行时构造任意复杂的谓词成为可能。

// Note that you shouldn't normally use == on objects
Predicate<Detail> itemPredicate = d-> item.equals(d.getItem());
Predicate<Detail> namePredicate = d-> name.equals(d.getName());

details.stream()
    .filter(itemPredicate.and(namePredicate))
    .collect(Collectors.toList());

关于java - 在java中按多个字段过滤的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42679295/

相关文章:

java - JAXB:如何获取包装类型的值(value)?

java - 数组重复过滤器 android/java 的问题

带有总和的 Map of Map 的 Java8 Map

java - 有没有一种首选方法可以将列表流收集到一个平面列表中?

java - java中手动绘制圆圈返回奇怪的结果

java - Intellij 13 JSF 对 Spring Beans 的支持

java - 如何使用 Java 8 Streams 将列表中的对象与 map 中的数据与条件进行匹配并保存到另一个 map

java - IntelliJ 不推断 Stream.collect() 类型结果

java - 如何强制 max 返回 Java Stream 中的所有最大值?

java - 如何重构在字符串列表中搜索文本的 for 循环