• 1.4 方法引用


    1.4 方法引用

    有些时候,你想要传递给其他代码的操作已经有实现的方法了。例如,假设你只想要在按钮被点击时打印event 对象,你可以像如下代码一样来调用:
     

    1. button.setOnAction(event -> System.out.println(event)); 

    如果你能够只将println 方法传递给setOnAction 方法,就更好了。下面是修改后的代码:
     

    1. button.setOnAction(System.out::println); 

    表达式System.out::println 是一个方法引用,等同于lambda 表达式x ->System.out.println(x)。我们再举另外一个例子,假设你希望不区分大小写地对字符串进行排序,那么可以传入下面这个方法引用:
     

    1. Arrays.sort(strings, String::compareToIgnoreCase) 

    正如示例代码所示,::操作符将方法名和对象或类的名字分隔开来。以下是三种主要的使用情况:

    对象::实例方法

    类::静态方法

    类::实例方法

    在前两种情况中,方法引用等同于提供方法参数的lambda 表达式。如之前所述,System.out::println 等同于System.out.println(x)。相似的,Math::pow等同于(x, y) -> Math.pow(x, y)。

    在第三种情况中, 第一个参数会成为执行方法的对象。例如String::compareToIgnoreCase 等同于(x, y) -> x.compareToIgnoreCase(y)。

    注意:如果有多个同名的重载方法,编译器会试图从上下文中找到最匹配的一个方法。例如,有两个版本的Math.max 方法,一个接收整型作为参数,而另一个接收double 类型的值。究竟会选择哪一个方法,取决于Math:max 被转换为的函数式接口的方法参数。同lambda 表达式类似,方法引用也不会独立存在,它们经常被用于转换为函数式接口的实例。

    你还可以捕获方法引用中的this 参数。例如,this::equals 就等同于x ->this.equals(x)。你也可以使用super 对象,以下方法表达式

    super::实例方法

    会使用this 作为执行方法的对象,并调用父类中指定的方法。以下是一些用来说明该机制的虚构示例:
     

    1. class Greeter {  
    2. public void greet() {  
    3. System.out.println("Hello, world!");  
    4. }  
    5. }  
    6. class ConcurrentGreeter extends Greeter {  
    7. public void greet() {  
    8. Thread t = new Thread(super::greet);  
    9. t.start();  
    10. }  

    当线程启动时,会调用它的Runnable 方法,然后执行super::greet 并调用父类中的greet 方法。

    注意:在匿名类中,你可以调用一个闭合类或父类的员工方法,例如闭合类.this::方法或者闭合类.super::方法。

  • 相关阅读:
    缓存问题
    基情探测器心得
    新手最常见的误解和错误
    C语言书籍推荐
    初学者编程实战指南 (4) 由一个简单的例子学习抽象
    数据结构的动画演示
    利用IDE使你的代码风格好看一些
    初学者编程实战指南 (2) 避免逻辑的重复
    入门编程语言的选择问题
    关于ACM集训队
  • 原文地址:https://www.cnblogs.com/songyz/p/6197441.html
Copyright © 2020-2023  润新知