private static class Utils {
public static int compareByLength(String in, String out) {
return in.length() - out.length();
}
}
private class MyObject {
public int compareByFirstChar(String in, String out) {
return in.charAt(0) - out.charAt(0);
}
}
@Test
public void testMethods() {
String[] args = new String[] { "microsoft", "apple", "linux", "oracle", "123" };
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String in, String out) {
return in.length() - out.length();
}
};
//传统的写法
Arrays.sort(args, comparator);
//引用静态类Utils里面的compareByLength方法
Arrays.sort(args, Utils::compareByLength);
MyObject mj = new MyObject();
//引用mj里面的compareByFirstChar方法
Arrays.sort(args, mj::compareByFirstChar);
//Lambda表达式写法
Arrays.sort(args, (in, out) -> {
return in.length() - out.length();
});
//引用System.out里面的println方法
Arrays.asList(args).forEach(System.out::println);
}
Arrays.sort(args, Utils::compareByLength);这种写法称作"方法引用"(Method references),也就是当我们需要将args排序时,不需要重新new一个Comparator类实现compare方法,可以引用一个已经存在的类的方法。当然,这个已存在的方法必须和compare方法的参数能对得上,并且被引用的接口必须是一个"函数接口"(FunctionalInterface).函数接口是java8引入的概念,一个函数接口只有一个抽象方法(default方法是一个实现)。