java - 使用 Java lambda 的外部可配置过滤

标签 java lambda filter java-8 java-stream

假设我有一个外部 JSON 作为:

[{
    "condition": "equals",
    "field": "name",
    "value": "jack"
  },
  {
    "condition": "greater",
    "field": "age",
    "value": 25
  }
]

这意味着我想在 Person 对象列表中检查姓名为 "jack"age > 25 的人。使用 Java 8 过滤非常简单(显示的示例仅按名称过滤)。

但是,我想让这个过滤器可配置,并且还应用多个过滤器。假设下面的 Person pojo(不言自明)采用姓名和年龄,我怎样才能使过滤器动态或可配置?

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Accessors and Mutators
}
List<Person> persons = Arrays.asList(
    new Person("mkyong", 30),
    new Person("jack", 20),
    new Person("lawrence", 40)
);

Person result1 = persons.stream()            // Convert to steam
    .filter(x -> "jack".equals(x.getName())) // we want "jack" only
    .findAny()                               // If 'findAny' then return found
    .orElse(null);  

我期待一个满足标准的 Person 对象列表。

最佳答案

据我所知,这与 streams 本身没什么关系。该过滤器方法只是一个 Predicate,它可以作为实例提供,例如来自您可以创建的工厂方法。

static Predicate<Person> fromName(String value){
    return p -> p.getName().equals(value);
}

假设您有另一种方法:

static Predicate<Person> fromAge(int value) {
    return p -> p.getAge() == value;
}

因为 Predicate.andPredicate.or 存在,你可以这样做:

 fromAge(12).and(fromName("jack"));

从而链接你的谓词

关于java - 使用 Java lambda 的外部可配置过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981255/

相关文章:

c# - 有 Lambda 脑筋急转弯的好资源吗

extjs - 在 ExtJs 6 中加载商店时如何发送自定义过滤器参数

java - Tomcat7 启动时 Java 版本不正确

java - 使用 MEL 在 Java 负载上调用方法

java - 如何在 lambda 函数中延迟初始化 Map?

javascript - 具有多选选项的 jQuery 过滤器

Javascript:如何为这样的列表创建过滤器?

java - 将 json 字符串转换为 json 数组 - android java

java - 如何检查字符串是否包含 '\r'\t' '\n' ...除了空格

c# - 动态改变lambda表达式的主体?