Java 8Lambda之方法引用(Method References)
方法引用分为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)的更多相关文章
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针 1.1. java方法引用(Method References) 与c#委托与脚本语言js ...
- JAVA 8 方法引用 - Method References
什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...
- 方法引用(Method References)
* 方法引用的使用 * * 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! * * 2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口 ...
- 方法引用(Method reference)和invokedynamic指令详细分析
方法引用(Method reference)和invokedynamic指令详细分析 invokedynamic是jvm指令集里面最复杂的一条.本文将详细分析invokedynamic指令是如何实现方 ...
- 【Java 8】方法引用
一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...
- java中的方法引用(method reference)官方文档总结
2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...
- Java中的函数式编程(四)方法引用method reference
写在前面 我们已经知道,lambda表达式是一个匿名函数,可以用lambda表达式来实现一个函数式接口. 很自然的,我们会想到类的方法也是函数,本质上和lambda表达式是一样的,那是否也可以用类 ...
- Java 8 特性 —— 方法引用
方法引用通过方法的名字来指向一个方法.方法引用可以使语言的构造更紧凑简洁,减少冗余代码.方法引用使用一对冒号 :: .下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不 ...
- Java学习笔记-方法引用
方法引用(Method Reference) 上一篇中记录了Lambda表达式,其可以创建匿名方法.当Lambda表达式只是调用一个存在的方法时,可以采用方法引用(JDK8具有的特性).如下: pub ...
随机推荐
- 轮播图插件 SuperSlide2.1滑动门jQuery插件
http://down.admin5.com/demo/code_pop/18/562/ SuperSlide2.1滑动门jQuery插件
- [WinForm]FastColoredTextBox控件(附源码)
Fast Colored TextBox is text editor component for .NET. Allows you to create custom text editor with ...
- hystrix -hystrix常用配置介绍
配置官网介绍地址:https://github.com/Netflix/Hystrix/wiki/Configuration hystrix.command.default.execution.iso ...
- iOS笔记杂记
Google Mobile Ads SDK更新至7.2.1不能编译,添加依赖库QuartzCore.framework后正常编译 imageName会把image缓存到手机内存里,不适合大量图片浏览会 ...
- Hibernate报错:Caused by: java.sql.SQLException: Field 'ID' doesn't have a default value
问题一: 报错如下: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assig ...
- Python中注释的添加
1.Python中注释,有助于我们对程序的理解:但注释不需要每行都写,可以在方法前面注释该方法的功能 或重要的一行进行注释. 2.单行注释,使用#号: 3.多行注释,使用""&qu ...
- libcurl使用认证证书 https认证
在server.xml中增加下面的内容: ciphers="SSL_RSA_WITH_RC4_128_SHA" 下面是libcurl 的测试代码: #include <std ...
- Android学习问题记录之java.lang.UnsatisfiedLinkError
1.问题描述 Android Studio引入第三方类库时,出现错误java.lang.UnsatisfiedLinkError: 11-09 14:58:05.500 13280-13280/cn. ...
- 让你真正了解chmod和chown命令的用法
问题导读:1.chown的英语含义是什么?2.chmod英语含义是什么?3.chown改变的是什么权限?4.chmod改变的是什么权限? 这两个对于初学者很容易混肴,这里ch,其实是change的简写 ...
- JavaScript 定时任务多事件冲突问题
var iCount = setInterval(ChangeTime, 3500);//3.5秒请求一次函数 function ChangeTime() { $.ajax({ type: " ...