【问题标题】:passing instance method as parameter in java 8在java 8中将实例方法作为参数传递
【发布时间】:2017-03-08 15:59:53
【问题描述】:

假设我有

public class Student {
     public Integer getGrade() { return 1;}
}

我想将此函数作为 Java 中的函数传递给其他类(不是学生)

哪种语法允许我这样做?

Function<Student,Integer> = ***

【问题讨论】:

    标签: java methods lambda java-8


    【解决方案1】:

    只要做:

    Function<Student,Integer> f = Student::getGrade;
    

    您似乎忘记为变量声明命名!

    解释:

    Function&lt;Student,Integer&gt; 表示以Student 作为参数并返回Integer 的函数。显然,getGrade 不满足这些标准。但是,由于调用getGrade需要Student对象(因为它是一个实例方法),编译器可以巧妙地使用传入的Student参数来调用getGrade

    如果你不明白我的意思,语法相当于:

    Function<Student,Integer> f = student -> student.getGrade();
    

    因此,下面两行是相同的:

    f(myStudent);
    myStudent.getGrade();
    

    【讨论】:

      【解决方案2】:

      Function&lt;Student, Integer&gt; 表示“你带一个学生并返回任何Integer 值”:

      Function<Student, Integer> f1 = student -> 2;
      

      如果您需要学生成绩,则从 getGrade 方法返回此值:

      Function<Student, Integer> f2 = student -> student.getGrade();
      

      使用方法引用,可以写成更短的形式:

      Function<Student, Integer> f3 = Student::getGrade;
      

      【讨论】:

        【解决方案3】:

        由于 getGrade 不是静态方法,您需要先实例化 Student 以存储对它的引用。

        Student student = ...;
        Supplier<Integer> = student::getGrade;
        

        您可能希望使用 Supplier 来存储对该方法的引用,因为您的方法采用 no 输入并返回一个输出(而 java Function 采用 one 输入并返回一个输出)。

        【讨论】:

          【解决方案4】:

          这样的——

          Function<Student, Integer> function = student -> student.getGrade();
          

          或方法引用为

          Function<Student, Integer> function = Student::getGrade;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-01
            • 2012-11-12
            • 1970-01-01
            • 2020-08-14
            • 1970-01-01
            • 1970-01-01
            • 2017-08-21
            相关资源
            最近更新 更多