方法引用分为4类,方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断。具体分类信息如下:

类型 使用方式
静态方法 ContainingClass::staticMethodName
指定实例的方法 containingObject::instanceMethodName
特定类实例的任意方法 ContainingType::methodName
构造方法 ClassName::new
    • 引用静态方法 
      ContainingClass::staticMethodName 
      例子: String::valueOf,对应的Lambda:(s) -> String.valueOf(s) 
      比较容易理解,和静态方法调用相比,只是把.换为::

    • 引用特定对象的实例方法 
      containingObject::instanceMethodName 
      例子: x::toString,对应的Lambda:() -> this.toString() 
      与引用静态方法相比,都换为实例的而已

    • 引用特定类型的任意对象的实例方法 
      ContainingType::methodName 
      例子: String::toString,对应的Lambda:(s) -> s.toString() 
      太难以理解了。难以理解的东西,也难以维护。建议还是不要用该种方法引用。 
      实例方法要通过对象来调用,方法引用对应Lambda,Lambda的第一个参数会成为调用实例方法的对象。

    • 引用构造函数 
      ClassName::new 
      例子: String::new,对应的Lambda:() -> new String() 
      构造函数本质上是静态方法,只是方法名字比较特殊。

一个实例:
package methodReference;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier; /**
* @author jiangxiulian
* @create 2017-12-28 下午12:03
**/
public class MethodReference { public static void main(String args[]){ //引用构造函数
PersonFactory factory = new PersonFactory(Person::new);
// PersonFactory personFactory = new PersonFactory(() ->new Person());
List<Person> personList = new ArrayList<Person>();
Person p1 = factory.getPerson();
p1.setName("Kobe");
personList.add(p1); Person p2 = factory.getPerson();
p2.setName("James");
personList.add(p2); Person p3 = factory.getPerson();
p3.setName("Paul");
personList.add(p3); Person[] persons1 = personList.toArray(new Person[personList.size()]);
System.out.print("排序前");
printArray(persons1);
System.out.println(); //引用静态方法
Arrays.sort(persons1,MethodReference::myCompare);
System.out.print("排序后");
printArray(persons1);
System.out.println(); Person[] persons2 = personList.toArray(new Person[personList.size()]);
System.out.print("排序前");
printArray(persons2);
System.out.println(); //引用特定对象的实例方法
Arrays.sort(persons2,p1::compare);
System.out.print("排序后");
printArray(persons2);
System.out.println(); Person[] persons3 = personList.toArray(new Person[personList.size()]);
System.out.print("排序前");
printArray(persons3); // 引用特定类型的任意对象的实例方法
Arrays.sort(persons3,Person::compareTo);
System.out.print("排序后");
printArray(persons3); } public static void printArray(Person[] persons) {
for (Person p : persons) {
System.out.print(p.name + " ");
}
System.out.println();
}
public static int myCompare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
} static class Person{
private String name; public Person(){ } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int compare(Person p1,Person p2){
return p1.getName().compareTo(p2.getName());
} public int compareTo(Person p){
return this.getName().compareTo(p.getName());
}
}
static class PersonFactory{
private Supplier<Person> supplier; public PersonFactory(Supplier<Person> supplier){
this.supplier = supplier;
} public Person getPerson(){
return supplier.get();
}
}
}

Java 8Lambda之方法引用(Method References)的更多相关文章

  1. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  2. JAVA 8 方法引用 - Method References

    什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...

  3. 方法引用(Method References)

    * 方法引用的使用 * * 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! * * 2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口 ...

  4. 方法引用(Method reference)和invokedynamic指令详细分析

    方法引用(Method reference)和invokedynamic指令详细分析 invokedynamic是jvm指令集里面最复杂的一条.本文将详细分析invokedynamic指令是如何实现方 ...

  5. 【Java 8】方法引用

    一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...

  6. java中的方法引用(method reference)官方文档总结

    2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...

  7. Java中的函数式编程(四)方法引用method reference

    写在前面 我们已经知道,lambda表达式是一个匿名函数,可以用lambda表达式来实现一个函数式接口.   很自然的,我们会想到类的方法也是函数,本质上和lambda表达式是一样的,那是否也可以用类 ...

  8. Java 8 特性 —— 方法引用

    方法引用通过方法的名字来指向一个方法.方法引用可以使语言的构造更紧凑简洁,减少冗余代码.方法引用使用一对冒号 :: .下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不 ...

  9. Java学习笔记-方法引用

    方法引用(Method Reference) 上一篇中记录了Lambda表达式,其可以创建匿名方法.当Lambda表达式只是调用一个存在的方法时,可以采用方法引用(JDK8具有的特性).如下: pub ...

随机推荐

  1. Apache编译安装

    1.准备好源码包并配置好yum源,需要的源码包包括:httpd-2.4.18.apr-1.5.2.tar.gz.apr-util-1.5.4.tar.gz 2.准备用户 groupadd -r apa ...

  2. 【zzuli-2266】number(二进制处理)

    题目描述 某人刚学习了数位DP,他在某天忽然思考如下问题: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9]的数码种类相同 ...

  3. SCM-MANAGER

    什么是SCM-MANAGER 基于Web的,集成了  Git. Mercurial .Subversion  多种代码管理工具的源代码管理平台 它有什么优点 简易安装 不需要破解配置文件,完全可配置的 ...

  4. HashMap resize方法的理解(一)

    对于oldTable中存储的为15.7.4.5.8.1,长度为8的一个数组中,存储位置如下 0 1 2 3 4 5 6 7 8 1 4 5 15 7 当扩容到一倍后,对于新的位置的选择通过e.hash ...

  5. 安装Spring报错An error occurred while collecting items to be installed

    原因主要是eclipse和spring版本之间的匹配问题. An error occurred while collecting items to be installed session conte ...

  6. FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...

  7. iOS开发之解决CocoaPods中“.h”头文件找不到的问题,简单粗暴的方法

    如果是拖进工程中的framework或者第三方文件,如果找不到,删除了重新添加或者修改search path地址,如果不知道怎么修改,在工程文件夹中,找到对应的文件,然后将文件拖到修改文件地址的位置, ...

  8. 用vue实现百度搜索功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. ubuntu版的sublime-text3输入中文问题

    前言 sublime-text3中看又中用,但是呢,ubuntu下有个问题,就是无法输入中文.这很难受啊,要写一些重要的内容时,总还是中文来的顺畅. 解决办法 工具:sublime-text-imfi ...

  10. sqlserver获取代理服务作业job的执行情况

    以下脚本为获取sqlserver的执行job with testtemp as( SELECT sch.job_id,--his.[server] as InstanceName CONVERT(nv ...