Java lambda表达式如何与谓词一起工作?

Java lambda表达式如何与谓词一起工作?,java,lambda,java-8,Java,Lambda,Java 8,我需要更多关于lambda表达式的说明。'p'如何表示列出人员?你能给我解释清楚吗 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.g

我需要更多关于lambda表达式的说明。
'p'
如何表示
列出人员
?你能给我解释清楚吗

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;
List people=new ArrayList();
添加(新人物(“穆罕默德”,69));
新增(新人员(“Doaa”,25));
添加(新人物(“Malik”,6));
谓词pred=(p)->p.getAge()>65;

不,
p
不是一个
列表
,而是一个

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

Lambdas在java中只是一个语法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;
    }
}
List people=new ArrayList();
添加(新人物(“穆罕默德”,69));
新增(新人员(“Doaa”,25));
添加(新人物(“Malik”,6));
谓词pred=新谓词(){
公共布尔测试(p人){
返回p.getAge()>65;
}
}
为了简化java中的语法,您可以跳过lambda表达式中的类型声明,只添加值的名称,就像您所做的那个样

Predicate<person> pred = (p) -> p.getAge() > 65;
谓词pred=(p)->p.getAge()>65;
或者如果你愿意,你可以写这样的东西

Predicate<person> pred = (person p) -> p.getAge() > 65;
谓词pred=(person p)->p.getAge()>65;
需要注意的是,只有当类型声明可以从lambda代码中计数时,才能跳过类型声明。比如说

Comparator<String> comp
= (firstStr, secondStr) // Same as (String firstStr, String secondStr)
    -> Integer.compare(firstStr.length(),secondStr.length());
比较器comp =(firstStr,secondStr)//与(stringfirststr,stringsecondstr)相同 ->比较(firstStr.length(),secondStr.length());
您能解释一下代码中的(p)以及迭代是如何发生的吗?@KannanThangadurai
(p)
,与
p
相同,(本例中不需要括号)是lambda表达式的形式参数。我建议您阅读lambda表达式。lambda不是匿名类的语法糖。Lambda表达式和匿名类共享一些常见用例,但仅此而已。对于这些常见的用例,您可以编写一个匿名类,该类与lambda表达式基本相同。但是它们不是同一件事,java有什么不同?在字节码中,我们将得到一个巨大的类,不是吗?@user2982622,绝对不是。甚至除了字节码,它们也是不同的(lambda是无状态的,具有不同的词法范围等等)。正如塔吉尔所指出的,在源代码级别上存在语义差异和不同的词法范围,也就是说,lambda不能定义实例变量,也不能调用它们将要实现的功能接口的方法,
超级
具有不同的含义。此外,还有
Comparator<String> comp
= (firstStr, secondStr) // Same as (String firstStr, String secondStr)
    -> Integer.compare(firstStr.length(),secondStr.length());