Lambda表达式可以用来创建匿名方法,有时候使用lambda表达式仅仅是调用一个已存在的方法:

Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));

在java8中,可以直接通过方法引用的来简写lambda表达式中已经存在的方法:

Arrays.sort(stringsArray,String::compareToIgnoreCase);

这种特性就是方法引用。

方法引用是一种更简洁易懂的lambda表达式,操作符是双冒号::,被用来直接访问类或者实例已经存在的方法或构造方法。方法引用提供了一种引用而不执行的方式,它需要由兼容的函数式接口构成的目标上下文。计算时,方法引用会创建函数式接口的一个实例。

在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用也允许我们这样做。

示例:

定义一个Person实体类

实现:已知一个person数组,通过生日进行排序,排序规则为:按照年龄从大到小排列

  • 使用Arrays的sort方法:
    public static void sort(T[] a, Comparator<? super T> c)
package com.example.jdknewuse;import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import static org.junit.Assert.*;/*** 实现:已知一个person数组,通过生日进行排序,排序规则为:按照年龄从大到小排列* 使用Arrays的sort方法:* public static <T> void sort(T[] a, Comparator<? super T> c)* Created by liumengbing on 2019/02/19 10:02.*/
public class PersonTest {@Testpublic void personTest() throws Exception{SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Person[] personArray = new Person[]{new Person(sdf.parse("20050901"),"tom"),new Person(sdf.parse("20010901"),"mary"),new Person(sdf.parse("20060901"),"jack"),new Person(sdf.parse("20020901"),"nick"),new Person(sdf.parse("20040901"),"sarah")};//方法一:使用匿名内部类Arrays.sort(personArray, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o1.getBirthday().compareTo(o2.getBirthday());}});System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]//方法二:因为Comparator接口是一个函数式接口,所以我们可以使用lambda表达式(未调用已存在的方法)Arrays.sort(personArray,(o1,o2)->{return o1.getBirthday().compareTo(o2.getBirthday());});System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]//方法三:使用lambda表达式(使用已存在的compareByAge方法)Arrays.sort(personArray,(o1,o2)->Person.compareByAge(o1,o2));System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]//方法四:因为这个Lambda表达式调用了一个已存在的方法,因此,我们可以直接使用方法引用来替代这个Lambda表达式Arrays.sort(personArray,Person::compareByAge);System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]   }
}

注意:方法引用Person::compareByAge在语义上与lambda表达式(o1,o2)->Person.compareByAge(o1,o2)是等同的。

总结:

方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)有以下四种形式的方法引用:


四种形式方法引用的具体用法示例请参看以下资料:
Java8之方法引用

Jdk1.8新特性(三)——方法引用::相关推荐

  1. 【java8新特性】——方法引用(四)

    一.简介 方法引用是java8的新特性之一, 可以直接引用已有Java类或对象的方法或构造器.方法引用与lambda表达式结合使用,可以进一步简化代码. 来看一段简单代码: public static ...

  2. JDK8新特性之方法引用

    转载自 JDK8新特性之方法引用 什么是方法引用 方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用. 如: List<String> list = ...

  3. 切克闹!Java8新特性之方法引用

    Java8 中引入方法引用新特性,用于简化应用对象方法的调用,方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法.方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标 ...

  4. JDK 8 新特性 之 方法引用

    概述 方法引用:当要传递给Lambda体的操作,已经有实现的方法了,就可以使用方法引用 方法引用:在Lambda的基础上进一步的简化.换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实 ...

  5. Java8新特性 - 04 - 方法引用05 - 方式四 【类名::new】

    1.类名::new 1.将Lambda表达式 替换为 [类名::new] 的写法. 2.确保 [类的构造方法] 的 参数与返回值 和 Lambda表达式的一致! * 分析 : 匿名内部类的方式 : 正 ...

  6. 【Java】JDK8新特性之方法引用

    什么是方法引用 方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用. 如: List<String> list = Arrays.asList(&q ...

  7. java8 构造函数引用_java8新特性之方法引用与构造器引用

    方法引用与构造器引用 关于lambda表达式,我们已经知道了,一般是有两部分组成.箭头操作符(->)左侧是lambda体的参数列表,右侧是lambda体,而lambda体里面的操作,有些情况下可 ...

  8. 小司机带你用Java8新特性之方法引用

    基于网上千篇一律的xxx.forEach(System.out::println)示例,不利于初学者理解, 所以小编自己撸了两个示例: 以下代码: package com.demo.java8;pub ...

  9. java 7 异常新特性_Java7的异常处理新特性-addSuppressed()方法等

    开发人员对异常处理的try-catch-finally语句块都比较熟悉.如果在try语句块中抛出了异常,在控制权转移到调用栈上一层代码之前,finally语句块中的语句也会执行.但是finally语句 ...

最新文章

  1. CV算法复现(分类算法1/6):LeNet5(1998年 LeCun)
  2. 全国计算机等级考试题库二级C操作题100套(第100套)
  3. 饿了么翻车,美团被质疑,马云也赔了40亿,这项技术为什么让人害怕?
  4. Docker安装Kafka(docker-compose.yml)
  5. 红宝书阅读笔记——OPENGL渲染管线
  6. protobuf3 自定义option_Protobuf3语法详解
  7. 服务器400_瓜分400万filecoin的入门条件:现货服务器
  8. golang语言渐入佳境[29]-math包核心方法
  9. mysql did not start_mysql 服务无法启动
  10. mysql s授权所有用户_查看MYSQL数据库中所有用户及拥有权限
  11. 破解日记 WiFi密码跑字典暴力破解 尽可能通俗易懂的版本
  12. vue json对象转数组_vue面试题汇总
  13. 单例模式 java 例子_java单例模式实例
  14. 矩阵分解(LU分解)C语言实现
  15. 谷歌浏览器搜索框记录_如何清除您的Google搜索记录
  16. 层次分析法 - MATLAB代码详解
  17. bitbucket 预览html,BitBucket基本使用操作
  18. GROMACS Tutorial 6-Free Energy Calculations
  19. 推理悬疑侦探小说大全合集隐私政策
  20. 图片去雾软件推荐,这些软件值得一试

热门文章

  1. Dvbbs8严重漏洞
  2. AndroidStudio Gradle自定义属性xmlns无法识别
  3. OAuth(开放授权):(第三方)通过(授权)令牌(Access Token)访问用户数据
  4. WebKit 内核源码分析 (四)
  5. 属性访问器(Property Accessor)----Setter/Getter
  6. C++中变量使用前一定要初始化
  7. 2016年腾讯产品笔试真题
  8. 面试题—Redis篇
  9. 消息队列—主要消息中间件优势对比
  10. 2019牛客暑期多校训练营(第一场)E题 ABBA(DP)