博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java8之lambda表达式(方法引用)
阅读量:6895 次
发布时间:2019-06-27

本文共 1613 字,大约阅读时间需要 5 分钟。

  hot3.png

有些时候,你想要传递给其他代码的操作已经有实现的方法了。示例:

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

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

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

表达式System.out::println是一个方法引用,等同于lambda表达式:

x -> System.out.println(x)

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

  • 对象::实例方法

  • 类::静态方法

  • 类::实例方法

在前两种情况中,方法引用等同于提供方法参数的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::实例方法。示例:

package java8;public class J2 {    public static void main(String[] args) {        Greeter g = new ConcurrentGreeter();        g.greet();    }}class Greeter {    public void greet(){        System.out.println("Hello world!");    }}class ConcurrentGreeter extends Greeter{    @Override    public void greet() {        //super代表当前类的对象的父类对象,并不是函数式接口的父实例对象        Thread t = new Thread(super::greet);        t.start();    }}
package java8;public class J3 {    public static void main(String[] args) {        Greeter1 g = new Greeter1();        g.greet();    }}class Greeter1 {    public void greet() {        //this代表的当前类的对象,并不是函数式接口的实例对象        Thread t = new Thread(this::printInfo);        t.start();    }    public void printInfo(){        System.out.println("test success!!");    }}

转载于:https://my.oschina.net/fhd/blog/417969

你可能感兴趣的文章
JAVA操作Trip数据库2
查看>>
LINQ系列:Linq to Object限制操作符
查看>>
[BZOJ1296][SCOI2009]粉刷匠(DP)
查看>>
Executor执行框架
查看>>
[FMX] Android APP 启动黑屏优化补丁
查看>>
常用JavaScript的高级技巧
查看>>
bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
查看>>
mysql 不同索引的区别和适用情况总结
查看>>
day01 认识python变量 数据类型 条件if语句
查看>>
【算法学习笔记】38.最短路问题 SJTU OJ 1105 path
查看>>
MarkDown写blog(测试)
查看>>
linux主机名 hostname
查看>>
[转]浅论Maven和Git的原理及展示其与Eclipse的集成
查看>>
盒子模型
查看>>
for in遍历对象属性注意事项
查看>>
Module not found: Error: Can't resolve 'XXX' in 'XXXX'
查看>>
Mac Mysql 修改初始化密码
查看>>
textarea 禁止拉伸
查看>>
js 常用正则表达式表单验证代码
查看>>
【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)
查看>>