lambda表达式如何与Predicate一起使用?

时间:2015-11-11 10:43:19

标签: java lambda java-8

我需要更多关于lambda表达式的说明。 'p'代表List<Person> people的方式?你能解释清楚吗

List<Person> people = new ArrayList<>();
people.add(new Person("Mohamed", 69));
people.add(new Person("Doaa", 25));
people.add(new Person("Malik", 6));
Predicate<Person> pred = (p) -> p.getAge() > 65;

2 个答案:

答案 0 :(得分:6)

不,p不是List<Person>,而是Person

Predicate<Person> pred = p -> p.getAge() > 65;

此lambda表达式声明1个形式参数并返回boolean。因此,它可以表示为Predicate(因为Predicate接口具有一个具有此精确签名的单一功能方法,称为test)。 p的类型将取决于您正在创建的Predicate的类型。

例如,在以下代码中,p将是List<Person>

Predicate<List<Person>> predicate = p -> p.isEmpty();

答案 1 :(得分:1)

java中的Lambdas它只是anonymous classes

的语法shugar

您示例中的代码等于

List<person> people = new ArrayList<>();
people.add(new Person("Mohamed", 69));
people.add(new Person("Doaa", 25));
people.add(new Person("Malik", 6));

Predicate<person> pred = new Predicate<person>() {
    public boolean test(person p) {
        return p.getAge() > 65;
    }
}

为了简化java中的语法,您可以跳过lambda表达式中的类型声明,只添加值的名称,就像您一样。

Predicate<person> pred = (p) -> p.getAge() > 65;

或者,如果你愿意,你可以写这样的东西

Predicate<person> pred = (person p) -> p.getAge() > 65;

需要注意的是,只有能够以某种方式从lambda代码中计算出来,才能跳过类型声明。例如

Comparator<String> comp
= (firstStr, secondStr) // Same as (String firstStr, String secondStr)
    -> Integer.compare(firstStr.length(),secondStr.length());