在了解 Lambda 表达式之后我们来看这样一段代码:

1
2
3
4
5
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 3, 5, 2, 4, 6);
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
System.out.println(list); // [1, 2, 3, 4, 5, 6]
}

如果 Lambda 表达式中仅仅是调用了一个已存在的方法在 Java8 中可以使 :: 关键字来替代 Lambda 表达式

关键字 :: 可以用来引用一个方法或构造器这种特性称为方法引用

1
2
3
4
5
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 3, 5, 2, 4, 6);
Collections.sort(list, Integer::compareTo);
System.out.println(list); // [1, 2, 3, 4, 5, 6]
}

声明一个函数式接口

1
2
3
4
@FunctionalInterface
interface Converter<I, O> {
O convert(I input);
}

引用静态方法(类名::静态方法名)

1
2
3
4
5
6
7
public static void main(String[] args) {
// 对应的 Lambda 表达式
// Converter<String, Integer> converter = (s) -> Integer.valueOf(s);
Converter<String, Integer> converter = Integer::valueOf;
Integer result = converter.convert("256");
System.out.println(result); // 256
}

引用对象的实例方法(对象::方法名)

1
2
3
4
5
6
7
8
public static void main(String[] args) {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 对应的 Lambda 表达式
// Converter<Date, String> converter = (date) -> format.format(date);
Converter<Date, String> converter = format::format;
String result = converter.convert(new Date());
System.out.println(result); // 2016-09-15
}

引用某种类型的任意对象的实例方法(类名::方法名)

1
2
3
4
5
6
7
public static void main(String[] args) {
// 对应的 Lambda 表达式
// Converter<String, Boolean> converter = (s) -> s.isEmpty();
Converter<String, Boolean> converter = String::isEmpty;
Boolean result = converter.convert("foo");
System.out.println(result); // false
}

引用构造方法(类名::new)

1
2
3
4
5
6
7
public static void main(String[] args) {
// 对应的 Lambda 表达式
// Converter<String, Integer> converter = (s) -> new Integer(s);
Converter<String, Integer> converter = Integer::new;
Integer result = converter.convert("256");
System.out.println(result); // 256
}