java8 [method reference]
来源:互联网 发布:英雄联盟网络连接断开 编辑:程序博客网 时间:2024/05/21 19:10
原文:method reference
lambda表达式通常用匿名方法。而有时候,lambda表达式做的仅仅是调用一个已经存在的方法,可以通过函数名调用该函数,即method reference。
以数组排序为例:
pubic class Person { public static int compareByAge(Person a, Person b) { return a.birthday.compareTo(b.birthday); }}Person[] personArray = ...class PersonAgeComparator implements Comparator<Person> { ...}
对personArray
排序
Arrays.sort(personArray, new PersonArayComparator());
该sort函数的签名是: static <T> void sort(T [] a, Comparator<? super T> c)
functional interface
因为Comparator
是一个函数接口(functional interface),因此可以用lambda替换: Arrays.sort(personArray, (a,b) -> Person.compareByAge(a, b));
method reference
又可以通过函数名调用该函数,替换后的lambda: Arrays.sort(personArray, Person::compareByAge);
两种已经存在的函数的lambda表达式,method reference和functional interface: Person::compareByAge和(a,b)->Person.compareByAge(a,b)
四种Method references
引用静态方法
Person::compareByAge
引用特定对象的实例方法
class ComparisonProvider { public int compareByName(Person a, Person b) { return a.getName().compareTo(b.getName());}ComparisonProvider obj = new ComparisonProvider();Arrays.sort(rosterAsArray, obj::compareByName)
method reference obj::compareByName
调用obj对象的compareByName方法,JRE推断出它的参数类型。这个例子中是(Person, Person)
引用特定类型的任意对象的实例方法
String[] stringArray = {"A", "B", "C"};Arrays.sort(stringArray, String::compareToIgnoreCase);
method reference String::compareToIgnoreCase
等效的lambda表达式参数列表(String a, String b)
,其中a和b是任意的名字。method reference会调用方法a.compareToIgnoreCase(b)
Constructor
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements( SOURCE sourceCollection, Supplier<DEST> collectionFactory) { DEST result = collectionFactory.get(); for (T t : sourceCollection) { result.add(t); } return result;}
functional interface Supplier
包含一个方法get
,get
方法没有参数并且返回一个对象,因此可以用lambda表达式调用函数transferElements
:
Set<Person> rosterSetLambda = transferElements(roster, () -> {return new HashSet<>();});
也可以用一个constructor reference替代lambda的位置:
Set<Person> rosterSet = transferElements(roster, HashSet::new);
编译器推断出你想要创建一个HashSet元素的类型是Person
,也可以指定类型为Person
: transferElements(roster, HashSet<Person>::new);
关键词:已经存在的方法;lambda
- java8 [method reference]
- java8方法引用(Method reference)
- Java8 中使用forEach + lambda expression/method reference 循环List和Map
- Java8中的Reference
- java8 class::method lambda
- ForEach Method in Java8
- java8中ForEach Method
- java8中ForEach Method
- Java Method Reference ::
- Lambda Expressions (Method Reference)
- java8 - 方法引用(method referrance)
- java8 - 方法引用(method referrance)
- Java8 方法引用-Method References
- Java8 默认方法 default method
- Method Reference in Java 8
- undefined reference to `Class::Method()'
- Java 8中慎用method reference
- 记录no static method cannot be reference
- 倍增LCA(最近公共祖先)算法详解
- 判断IE浏览器版本
- C++学习笔记之类的基本概念1
- C# namespace与java package
- 利用json和反射写了一个对类的读取和写入
- java8 [method reference]
- PHP常用函数
- Android的消息循环机制 Looper Handler类分析
- RecyclerView使用,item分割线,全选反选按钮实现
- CountDownLatch
- 淘宝新店如何破零
- LeetCode 668. Kth Smallest Number in Multiplication Table
- css---flex布局中,如何响应式 得水平垂直居中?flex子元素左右 上下居中
- 面向对象相关问题