【问题标题】:How lambda expression works with Predicate?lambda 表达式如何与 Predicate 一起使用?
【发布时间】:2015-11-11 10:43:19
【问题描述】:

我需要更多关于 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;

【问题讨论】:

    标签: java lambda java-8


    【解决方案1】:

    不,p 不是 List&lt;Person&gt; 而是 Person

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

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

    例如,在以下代码中,p 将是 List&lt;Person&gt;

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

    【讨论】:

    • 你能解释一下代码中的 (p) 以及这里的迭代是如何发生的吗?
    • @KannanThangadurai (p),和p一样,(这种情况下不需要括号)是lambda表达式的形参。我建议你阅读 this Oracle tutorial 的 lambda 表达式。
    【解决方案2】:

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

    【讨论】:

    • Lambda 不是匿名类的语法糖。 Lambda 表达式和匿名类共享一些常见的用例,仅此而已。对于这些常见的用例,您可以编写一个等效于 lambda 表达式的匿名类,基本上做同样的事情。但它们不是一回事。
    • 和java有什么区别?在字节码中,无论如何我们都会得到匿名类,不是吗?
    • @user2982622,绝对不是。甚至除了字节码,它们也是不同的(lambdas 是无状态的,有不同的词法范围等等)。
    • 正如 Tagir 所指出的,在源代码级别存在语义差异和不同的词法范围,即 lambda 不能定义实例变量,也不能调用它们将要实现的功能接口的方法, thissuper 有不同的含义。此外,还有some practical differences at runtimebig differences on the byte code level
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多