Lambda 表达式可以转换为方法引用,从而使代码更简洁。主要有以下几种情况:
- 对象::实例方法名
用于代替 Lambda 表达式 obj -> obj.methodName()
例如:
Consumer<String> c = s -> s.toUpperCase();
可以转换为:
Consumer<String> c = String::toUpperCase;
- 类::静态方法名
用于代替 Lambda 表达式 (args) -> ClassName.staticMethodName(args)
例如:
Function<Integer, Integer> f = (x) -> Math.multiplyExact(x, 2);
可以转换为:
Function<Integer, Integer> f = Math::multiplyExact;
- 类::实例方法名
用于代替 Lambda 表达式(obj, args) -> obj.instanceMethodName(args)
例如:
BiPredicate<String, String> bp = (s, t) -> s.equals(t);
可以转换为:
BiPredicate<String, String> bp = String::equals;
- 构造方法引用
用于代替 Lambda 表达式 (args) -> new ClassName(args)
例如:
Supplier<String> supplier = () -> new String();
可以转换为:
Supplier<String> supplier = String::new;
我们来看一些具体的转换例子:
list.forEach(s -> s.toUpperCase());
可以转换为:
list.forEach(String::toUpperCase);
Function<Integer, Integer> f = (x) -> Math.multiplyExact(x, 2);
可以转换为:
Function<Integer, Integer> f = Math::multiplyExact;
BiPredicate<String, String> bp = (s, t) -> s.equals(t);
可以转换为:
BiPredicate<String, String> bp = String::equals;