方法引用分为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. springmvc日期格式化

    jsp页面String类型转Controller后台Date类型 方法1.在实体中加入日期格式化注解 @DateTimeFormat(pattern="yyyy-MM-dd") p ...

  2. 【51nod-1010】因子只含有2 3 5的数

    K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = ...

  3. log4cpp总结

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. lombok --- 常用注解解析

    @Data@Getter @Setter @ToString@Cleanup@NonNull@Builder@EqualsAndHashCode      

  5. SpringAnnotation注解之@Autowired

    @Autowired:自动装配,不用在bean里写<property>属性来指定所依赖的属性 1 2 3 4 @Autowired public void setUserDao(UserD ...

  6. C++STL内存配置的设计思想与关键源码分析

    说明:我认为要读懂STL中allocator部分的源码,并汲取它的思想,至少以下几点知识你要了解:operator new和operator delete.handler函数以及一点模板知识.否则,下 ...

  7. APUE学习笔记——8.1-8.4 进程基础

    进程ID 1 进程id是唯一的.(不会有进程id一样的两个进程) 2进程id是可复用的,一个进程销毁后,它的id号可以被新的进程使用.但是Unix采用了延迟复用的算法,也就是进程   销毁后它的id不 ...

  8. LINUX系统下PXE网络安装虚拟机

    PXE(preboot execute environment),预启动执行环境.由于安装系统的时候,有时候是大批量的安装:这时使用磁盘或虚拟机进行单个安装,效率太差:所以我们开始使用PXE网络安装L ...

  9. java事务(三)

    java事务(三)——自己实现分布式事务 在上一篇<java事务(二)——本地事务>中已经提到了事务的类型,并对本地事务做了说明.而分布式事务是跨越多个数据源来对数据来进行访问和更新,在J ...

  10. storyboard出口回退问题

    问题 直接在Main.storyboard拖动添加到出口的时候总是出一些不知名的错误.猜想可能是swift4又TM换了新特性(不过好喜欢啊哈哈哈哈) 解决 其实可以先拖动添加@IBAction函数到代 ...