码迷,mamicode.com
首页 > 编程语言 > 详细

java8之lambda表达式(方法引用)

时间:2015-05-21 22:47:45      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

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

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!!");
    }
}

java8之lambda表达式(方法引用)

标签:

原文地址:http://my.oschina.net/fhd/blog/417969

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!