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

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

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!!");
    }
}
时间: 2024-10-07 09:48:03

java8之lambda表达式(方法引用)的相关文章

jdk1.8新特性Lambda表达式方法引用

前言 在之前我们接触了JDK1.8引入的新特新lambda表达式没在某种程度上,它可以简化我们的代码,帮助我们快速的编写代码,但在这其中我们之前的编写方式并不是lambda表达式最简洁的方式,而在头屑情况下我们可以使用lambda表达式的方法引用是代码进一步简洁化. 一.方法引用: 在java中方法引用主要是用来替代lambda表达式进一步简化代码,方法引用符号的写法是两个冒号“::”,其中方法引用的用法有一下几种. 1.对象名称::成员方法 如果一个对象中有一个成员方法,就好就是lambda表

JAVA8之lambda表达式详解,及stream中的lambda使用

原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算

Android 使用Java8新特性之"方法引用"

前言 上一文:Android 使用Java8新特性之Lambda expression (附命令者模式简化) 说过lambda表达式,在android studio中的环境配置及应用.本文讲下Java8新特性之"方法引用". "方法引用",它其实可以看成lambda表达式的一种简写形式. 再回顾一下lambda表达式的应用场景:简化仅含单一抽象方法接口的调用 方法引用的4种形式 方法引用的符号形式,形如, [className | class-instance]::

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最近看了一下java 8的一些新特性,其中最重要的莫过于Lambda表达式了,通过一阵子的学习,原本准备自己写一篇博客的,后来阅读了一位学长翻译过来的博客(原文是Brain Goetz的State of Lambda,下面会给出原文链接),觉得写的十分完美,把我想要写的和我没想到的都罗列了出来,就把这个分享给大家了. 注:原译文见  http://lucida.me/blog/java-8-lambdas-insideout-language-features/ 英语原版见:http://cr.

[转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language-features 本文谢绝转载,如需转载需征得作者本人同意,谢谢. -------------------------------------内容分割线--------------------------------------------------------- 关于 本文是深入

Java8特性Lambda表达式

Lambda 表达式 简介: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). (parameters) -> expression 或 (parameters) ->{ statements; } 使用 Lambda 表达式需要注意以下两点: Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口.在上面例子中,我们使用各种类型的Lambda表达式来定义MathO

Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的,这篇文章就来聊聊这些新特性. lambda 表达式 lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java 的代码,变得更加的简洁,我觉得这也是为什么 Java8 能够很快的流行起来的原因吧.

java8之lambda表达式(构造器引用)

构造器引用同方法引用类似,不同的是在构造器引用中方法名是new.例如,Button::new表示Button类的构造器引用.对于拥有多个构造器的类,选择使用哪个构造器取决于上下文.假设你有一个字符串列表,并且希望调用Button类的构造器使用列表中的字符串来构造一个按钮列表,可以使用如下表达式: List<String> labels = ....; Stream<Button> stream = labels.stream().map(Button::new); List<

java8之lambda表达式(默认方法)

许多开发语言都将函数表达式集成到了其集合库中.这样比循环方式所需的代码更少,并且更加容易理解.以下面的循环为例: for(int i = 0; i < list.size(); i++)      System.out.println(list.get(i)); 事实上有一种更好的方式.API开发人员可以提供一个forEach方法,用来将一个函数应用到集合的每个元素上.下面是使用这种方式编写的一个简单调用: package java8test; import java.util.Arrays;