在Java 8中可以通过class::methodName 的方式引用一个类或者实例的方法。
方法引用的类型
Java 8 有四种方法引用的形式
- 引用静态方法:直接引用类的静态方法,例如
Math::max等同于Math.max(x,y) - 通过实例引用实例方法:例如:
System.out::println等同于System.out.println(x) - 通过类引用实例方法: 例如
String::length等同于str.length() - 引用构造函数:例如
ArrayList::new等同于new ArrayList()下面详细介绍一下这几种方法引用的形式:
引用静态方法
使用Math.max() 作为例子来解释:
List<Integer> integers = Arrays.asList(1,2,3,5);
Optional<Integer> max = integers.stream().reduce(Math::max);
max.ifPresent(value - > System.out.println(value));
输出:
5
通过实例引用实例方法
还是使用上面的例子,只需要更改最后一行代码即可
List<Integer> integers = Arrays.asList(1,2,3,5);
Optional<Integer> max = integers.stream().reduce(Math::max);
max.ifPresent(value - > System.out::println);
输出:
5
通过类引用实例方法
这里使用String::compareTo作为例子使用:
List<String> strings = Arrays
.asList("how", "to", "do", "in", "java", "dot", "com");
List<String> sorted = strings
.stream()
.sorted((s1, s2) -> s1.compareTo(s2))
.collect(Collectors.toList());
System.out.println(sorted);
List<String> sortedAlt = strings
.stream()
.sorted(String::compareTo)
.collect(Collectors.toList());
System.out.println(sortedAlt);
输出:
[com, do, dot, how, in, java, to]
[com, do, dot, how, in, java, to]
引用构造函数
这里使用 ArrayList::new 作为例子:
List<Integer> integers = IntStream
.range(1, 100)
.boxed()
.collect(Collectors.toCollection( ArrayList::new ));
Optional<Integer> max = integers.stream().reduce(Math::max);
max.ifPresent(System.out::println);
输出:
99