2017/7/5

转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html

今天要说的是java中的一项新特性,方法引用,method reference。方法引用完全可以用lambda来代替,不会根本不影响平时的开发,但是如果学会了方法引用的话,可以装逼!

本文按照官方文档的例子来解释。

方法引用(method reference)

方法引用只是lambda表达式的拓展,如果不了解lambda表达式,请先阅读本文:java语言中的匿名类与lambda表达式介绍与总结

有时候lambda表达式只是调用了一个已经申明过的方法,为了增加可读性(zhuang bi)和进一步简化,可以使用方法引用。

下面的例子可以很好说明方法引用的使用情形

例子:如果想要按照年龄(age)来给人(Person)排序

有一个Person的数组 rosterAsArray。首先我们实现一个 Comparator,然后使用Arrays.sort来排序

 Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);

 class PersonAgeComparator implements Comparator<Person> {
public int compare(Person a, Person b) {
return a.getBirthday().compareTo(b.getBirthday());
}
} Arrays.sort(rosterAsArray, new PersonAgeComparator());

这里我们看到Comparator实际上是个函数接口(functional interface),所以直接用lambda来简化

 Arrays.sort(rosterAsArray,
(Person a, Person b) -> {
return a.getBirthday().compareTo(b.getBirthday());
}
);

假设Person中已经存在一个static的方法 Person.compareByAge 来比较两个人的年龄,那么我们可以写成如下

 Arrays.sort(rosterAsArray,
(a, b) -> Person.compareByAge(a, b)
);

这个时候我们发现,实际上这个lambda只是调用了已经存在的一个函数compareByAge,那么我们就可以用方法引用了,我们可以写成更简单的形式:

 Arrays.sort(rosterAsArray, Person::compareByAge);

一行搞定!

4种不同类型的方法引用

很直接,我就不做说明直接上表格了

类型 例子
static方法的引用 ContainingClass::staticMethodName
特定对象的方法的引用 containingObject::instanceMethodName
特定类型的方法的引用 ContainingType::methodName
构造器的引用 ClassName::new

参考

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

java中的方法引用(method reference)官方文档总结的更多相关文章

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

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

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

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

  3. java中的方法引用

    引用静态方法:类名称::static 方法名称: 引用某个对象的方法:对象::普通方法: 引用特定类方法:特定类::方法 引用构造方法:类名称::new 范例:引用静态方法 package com.j ...

  4. Java 8Lambda之方法引用(Method References)

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

  5. java中的方法(method)到底怎么用?给个例子

    7.方法(method)   被调例子, int add(int x, int y){ return x+y; } 主调例子, for example: int result = add(5,3); ...

  6. java 方法引用(method reference)

    it -> it != null等价于Objects::nonNull

  7. java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)

    之前在看深入理解Java虚拟机一书中第一次接触相关名词,但是并不理解,只知道Object obj = new Object()类似这种操作的时候,obj就是强引用.强引用不会被gc回收直到gc roo ...

  8. jboss7 Java API for RESTful Web Services (JAX-RS) 官方文档

    原文:https://docs.jboss.org/author/display/AS7/Java+API+for+RESTful+Web+Services+(JAX-RS) Content Tuto ...

  9. Unity关于方法事件生命周期官方文档

    http://docs.unity3d.com/Manual/ExecutionOrder.html 一.组件运行的基本顺序 下图中创建类的顺序为A,B,C,A1,二运行的结果为A1,B,C,A. 可 ...

随机推荐

  1. 20155212 实验四 《Android程序设计》 实验报告

    20155212 实验四 <Android程序设计> 实验报告 (一)Android Stuidio的安装测试 参考<Java和Android开发学习指南(第二版)(EPUBIT,J ...

  2. Android 桌面不显示应用图标

    忽然有一天,运行自己的程序,发现桌面没有应用图标了. google了半天,也没什么发现. 最后发现是主Activity中: <action android:name="android. ...

  3. WannaflyUnion每日一题

    ---恢复内容开始--- 1. http://www.spoj.com/problems/KAOS/ 题意:给定n个字符串,统计字符串(s1, s2)的对数,使得s1的字典序比s2的字典序要大,s1反 ...

  4. Mac下修改环境变量并保存

    1. 终端执行 touch ~/.bash_profile 2.终端执行 vim ~/.bash_profile 3.点一下向下箭头,点E 进入bash_profile文件 4.点i进入编辑模式,进行 ...

  5. malloc与new相关

    前言: 通常我们使用数组的时候:必须提前用一个常量来指定数组的长度,同时它的内存空间在编译的时候就已经被分配了.但是有时候数组的长度只有在运行的时候才能知道.因此,一种简单的解决方案就是提前申请一块较 ...

  6. 前端教你学UI——人物处理(一)

    一.序言 本文作为本系列的第一篇写UI的文章,开头还是有必要申明一些东西的,本系列主要是为了作为博主在前端工作之余学习UI的一个记录,同时为了让更多的同行学习到一些编程之外的其他东西.所以本文会尽可能 ...

  7. nodeJS之路径PATH模块

    前面的话 path模块包含一系列处理和转换文件路径的工具集,通过 require('path') 可用来访问这个模块.本文将详细介绍path模块 路径组成 [path.dirname(p)] 返回路径 ...

  8. vmware和centOS的安装

    如果勾上了,会立即在本机开辟20g的空间,需要很长时间 选择电脑中ISO镜像的位置,之后点击开启虚拟机! 这个密码是root用户的密码!管理员密码! 可以选择我们的Minimal没有界面的!

  9. 用WebStorm创建Express项目时出现:express version is unavailable

    那是因为在npm的配置文件中使用了代理: 方式一:查看配置:npm config list如果有:registry = "https://registry.npm.taobao.org/&q ...

  10. Day1 - Python基础1 Python介绍、基本语法、流程控制习题集

    1.打印Hello World! print("Hello World!") 或 name="你好,世界!" print(name) 2.声明变量:打印name ...