加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:38:44 所属栏目:Java 来源:网络整理
导读:假设我有一个外部 JSON: [{ "condition": "equals","field": "name","value": "jack" },{ "condition": "greater","field": "age","value": 25 }] 这意味着我想在名为“jack”和年龄的人的Person对象列表中进行检查. 25.使用Java 8过滤相当简单(显示的示例
假设我有一个外部 JSON:

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

这意味着我想在名为“jack”和年龄>的人的Person对象列表中进行检查. 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对象列表.

解决方法

据我所知,这与流本身没什么关系.该过滤方法只是一个谓词,可以作为实例提供,例如从您可以创建的工厂方法.

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

假设你有另一种方法:

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

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

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

从而链接你的谓词

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读