你可以Lambda表达式去创建匿名的方法。但很多时候,这份方法可能是已经存在的,这时你可以使用函数引用。这样能够使代码结构更清晰。
我们知道,贪心算法里面,一个常见的步骤是排序。假设有下面的背包类:
class Package{
private int weight;
// ignore setter and getter
}Arrays.sort(packages,
new Comparator<Package>(){
public int compare(Package a,Package b){
return Integer.valueOf(a.getWeight()).compareTo(Integer.valueOf(b.getWeight()));
}
});Arrays.sort(packages,
(Package a,Package b) ->{
return Integer.valueOf(a.getWeight()).compareTo(Integer.valueOf(b.getWeight());
});public static int compageW(Package a,Package b){
return Integer.valueOf(a.weight).comPareTo(Integer.valueOf(b.weight));
}
Arrays.sort(packages,
(a,b) -> Person.compareW(a,b));Arrays.sort(packages,Person::caompareW);
前面的例子是 对静态函数的引用。Java8还支持对特定类型实例方法的引用,对一种类型的任意对象函数引用,对构造器的引用。
对特定对象实例方法的引用也很简单,假设前面的compareW方法不是static的。
我们可以使用,
Package p = new Package();
Arrays.sort(packages,
p::compareW);对特定类型实例方法的引用,如,
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
对构造器的引用,
这个例子来自Oracle的教程,是完成两个集合之间的复制。
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;
}你的调用可能是,
Set<Person> rosterSetLambda =
transferElements(roster, () -> { return new HashSet<>(); });可以使用函数引用简化,
Set<Person> rosterSet = transferElements(roster, HashSet<Person>::new);
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method
reference.
原文地址:http://blog.csdn.net/chenloveit/article/details/39187001