External configurable filtering using java lambda

Suppose I have an external JSON:

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

This means I want to check in the person object list of people named "Jack" and age > 25. Filtering using java 8 is quite simple (the example shown filters only on the name)

However, I want to make this filter configurable and apply multiple filters Assuming the following person POJO (which is self-evident), take the name and age, how can I make the filter dynamic or configurable?

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

I expect a list of qualified person objects

Solution

As far as I know, this has nothing to do with the flow itself The filter method is just a predicate and can be provided as an instance, such as from a factory method you can create

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

Suppose you have another method:

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

Because predict and,Predicate. Or exists, you can do this:

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

To link your predicates

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>