方法引用分为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. Linux安装apue.3e(基于ubuntu16.0.4)

    本菜刚刚学习UNIX高级编程,无奈搭建本书编程环境时遇到不少问题,参考了网上各路大神的解决办法,最终解决了问题. (1)下载源代码,可以去官网下载:http://apuebook.com/code3e ...

  2. MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点

    背景知识1:     在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令.常用 ...

  3. C# 解决串口接收数据不完整

    方法1: 使 用缓存机制完成.首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);用来存放所有的数据,在接收函数里,通过 ...

  4. Linux系统下第三方软件安装实例

    在第三方软件安装的时候,首先要有自己的rpm安装包!然后要有可以使用的yum源(前面有关于yum源的介绍) 一.安装wps步骤如下: 1)首先进入安装包所在目录,并查看有没有要安装的软件 2)然后,对 ...

  5. Laravel 文件夹结构简介

    表 1.1:Laravel 文件夹结构简介 文件夹名称 简介 app 应用程序的业务逻辑代码存放文件夹 app/Console 存放自定义 Artisian 命令文件 app/Http/Control ...

  6. ss-libev 源码解析udp篇 (4)

    本篇分析remote_recv_cb,这是整个udp转发的反方向,即读取从后端发送过来的数据再发送给前端.对于ss-server,读取到的数据是目标地址的udp服务器发送回来的响应数据,ss-serv ...

  7. 自己总结 C++ 代码规范

    .编写原则,代码尽量简单,简洁,高效,自己写的代码让自己和别人容易看懂 .命名: a. 类的成员变量加前缀 m_(表示 member). 常量全用大写的字母,用下划线分割单词(;) 循环变量和简单变量 ...

  8. 6.二元查找树的后序遍历结果[PostOrderOfBST]

    [题目] 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...

  9. js之留言字数限制

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. 【Python】下载图片

    import requests import bs4 import urllib.request import urllib import os hdr = {'User-Agent': 'Mozil ...