你怎么能改写这些lambdas?

时间:2016-10-26 09:09:41

标签: java lambda functional-programming java-8

考虑以下课程

class Person {

private String firstName; 
private String lastName; 
private int age; 
private Address address;

//Assume getters are also available

}

lambda#1:过滤特定年龄的人

public List<Person> getPersonsOfAge(int age) {
    List<Person> persons= fillPersonsInfo();
    persons.stream().fiter(person -> person.getAge() == 21).collect(Collectors.toList());
}

lambda#2:过滤具有特定姓氏的人

public List<Person> getPersonsAboveAge(String name) {
    List<Person> persons= fillPersonsInfo();
    persons.stream().fiter(person -> person.getLastName().equals(name)).collect(Collectors.toList());
}

lambda#2:过滤住在指定地址的人

public List<Person> getPersonsAboveAge(Address address) {
    List<Person> persons= fillPersonsInfo();
    persons.stream().filter(person -> person.getAddress().equals(address)).collect(Collectors.toList());
}

你可以制作这些lambdas的紧凑程度吗?你能将所有三个lambda减少到一个函数引用吗?

2 个答案:

答案 0 :(得分:2)

  

你可以制作这些lambdas吗?

正如Tunaki在评论中所说,删除所有空格,将person重命名为p。顺便说一句,这个问题根本没有意义。

  

你能将所有三个lambda减少为单个函数引用吗?

然而,这个问题更有意义。如果你的意思是每次想要过滤新的谓词时都不要强制创建一个新方法,你可以改为Predicate作为参数:

private static List<Person> getPersonsFilteredOn(Predicate<Person> p) {
    return fillPersonsInfo().stream()
                            .filter(p)
                            .collect(Collectors.toList());
}

用法变为

Predicate<Person> agedOf12 = p -> p.getAge() == 12;
Predicate<Person> liveAtFooStreet = p -> p.getAddress().equals(new Address("Foo street"));
Predicate<Person> areCalledBar = p -> p.getLastName().equals("Bar");

List<Person> twelveYearsOld = getPersonsFilteredOn(agedOf12);
List<Person> fooStreetNeighourhood = getPersonsFilteredOn(liveAtFooStreet);
List<Person> barFamily = getPersonsFilteredOn(areCalledBar);

当你想要组合谓词时,就会出现这种方法的强大功能:

List<Person> barTeenagersLivingFooStreet = getPersonsFilteredOn(agedOf12.and(liveAtFooStreet).and(areCalledBar));

答案 1 :(得分:1)

您可以使用其他所有方法调用的辅助方法,并为每种方法传入过滤器

 private List<Person> filterPeople(Predicate<Person> filter){
     List<Person> persons= fillPersonsInfo();
     return persons.stream()
           .filter(filter)
           .collect(toList());
 }

 public List<Person> getPeopleOfAge(int age){
     return filterPeople(person -> person.getAge == age);
 }

 public List<Person> getPeopleOfName(String name){
     return filterPeople(person -> person.getName().equals(name));
 }