代码之家  ›  专栏  ›  技术社区  ›  The Scientific Method

类是否在lambda表达式中实例化[[副本]

  •  4
  • The Scientific Method  · 技术社区  · 6 年前

    printStudents(
        roster,
        (Student s) -> s.getGender() == Student.Sex.MALE
            && s.getAge() >= 18
            && s.getAge() <= 25
    );
    

    方法签名:

    printStudents(List<Student> roster, CheckStudent checkstudet)
    


    interface CheckStudent {
        boolean test(Student s);
    }
    

    编辑

    你们中的一些人建议我重构代码,但同样的问题也出现了。

    CheckStudent checkStudent = (Student s) -> s.getGender() == Student.Sex.MALE && s.getAge() >= 18 && s.getAge() <= 25;
    

    是一个班级(我不是指班级) Student )在赋值的右侧实例化?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Community Mike Kinghan    4 年前

    lambda表达式的值是对类实例的引用 . 所以,实际上,是的,一个类的实例正在被创建。看医生怎么说:

    在运行时,lambda表达式的求值类似于 类实例创建表达式的求值,只要是正常的 完成生成对对象的引用。

    不需要在lambda表达式的每次求值中都分配新对象 . 我们来看看这些文件:

    或具有 引用以下属性。

    [...]

    Java编程语言,即:

    • 不需要在每次评估时都分配一个新对象。

    • 由不同lambda表达式生成的对象不必属于不同的类(例如,如果实体相同)。

    • 通过求值生成的每个对象不必属于同一类(例如,捕获的局部变量可能是内联的)。

    • 如果“现有实例”可用,则不需要在之前的lambda评估中创建它(它可能已被分配) 例如,在封闭类的初始化过程中)。

    Java语言规范,第章 “15.27.4. Run-time Evaluation of Lambda Expressions” .

    推荐文章