Java SE 8 在 Java 语言层面上新增了 lambda expression 的功能,使得 Java 具备了函数式语言的能力 - 可以将函数作为方法参数传递,即 code as data。
JDK 8 ( Oracle 对 Java SE 8 的实现 ) 新增了 java.util.stream , method reference , functional interface,这些都与 lambda expression 密切相关。
Java Tutorial 介绍了 method reference,说它一共有四种形式:
Kind
Example
Reference to a static method
ContainingClass::staticMethodName
Reference to an instance method of a particular object
containingObject::instanceMethodName
Reference to an instance method of an arbitrary object of a particular type
ContainingType::methodName
Reference to a constructor
ClassName::new
但是,官方文章也没有讲清第二三种方式的区别。
这篇文章https://blog.csdn.net/lengguoxing/article/details/78414852讲的很清楚。
第二种方式适用的情况是:方法调用者不是传进来的参数。
class ComparisonProvider {
public int compareByName(Person a, Person b) {
return a.getName().compareTo(b.getName());
}
public int compareByAge(Person a, Person b) {
return a.getBirthday().compareTo(b.getBirthday());
}
}
ComparisonProvider myComparisonProvider = new ComparisonProvider();
Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
compareByName 将传进来的两个参数全部作为参数。
第三种方式适用的情况是:方法调用者是传进来的第一个参数。
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
compareToIgnoreCase 的调用者是传进来的第一个参数。
第三种方式有点费解,个人认为不如用 lambda expression 来得简洁易懂、不易出错。
参考资料:
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章