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

use*_*943 5 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;
 }
Run Code Online (Sandbox Code Playgroud)

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

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

如果我有 50 个其他类要过滤多个字段,有没有办法概括这一点?

dim*_*414 7

你可以用.and()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());
Run Code Online (Sandbox Code Playgroud)