“方法引用” 学习笔记
2018-08-05 本文已影响0人
freeseawind
开发环境
- eclipse 4.7.3a
- jdk 9
前言
通常使用lambda表达式来创建匿名方法(或匿名内部类)。然而,有时候我们已存在一个可用的方法,我们系统直接访问类或者实例的已经存在的方法或者构造方法。Java 8引入了一种新语言特性——方法引用,简写lambda表达式中已经存在的方法。
方法的引用的方式
描述 | 例子 |
---|---|
引用静态方法 | ContainingClass::staticMethodName |
引用对象的某个实例方法 | containingObject::instanceMethodName |
引用类型对象的方法 | ContainingType::methodName |
引用构造方法 | ClassName::new |
注意方法引用是一个Lambda表达式,其中方法引用的操作符是 "::"。
例子
需求:在公司中,我们通常会按员工的生日日期进行排序,以便发放生日礼物
我们先来看下使用Lambda表达式的例子
Arrays.sort(rosterAsArray,
(Person a, Person b) -> {
return a.getBirthday().compareTo(b.getBirthday());
}
);
使用静态方法的例子
public static int compareByStaticMethod(Person a, Person b)
{
return a.birthday.compareTo(b.birthday);
}
Arrays.sort(rosterAsArray, MethodReference::compareByStaticMethod);
使用实例化对象方法的例子
public int compareByInstanceMethod(Person a, Person b)
{
return a.birthday.compareTo(b.birthday);
}
Object obj = new XX();
Arrays.sort(rosterAsArray, obj ::compareByInstanceMethod);
使用类型对象的方法
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareTo);
List<Person> list = new ArrayList<>();
list.stream().anyMatch(Person::isEmpty);
引用构造方法的例子
public static HashSet<String> asynBlock(Callable<HashSet<String>> callable) throws Exception
{
return callable.call();
}
//
asynBlock(HashSet::new);