方法引用可以用于代替功能接口中的 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;
我们来看一些具体的应用例子:
- 对象::实例方法名
list.forEach(String::toUpperCase); // 将每个字符串转换为大写
这里 String::toUpperCase 代替了 s -> s.toUpperCase()。
- 类::静态方法名
list.replaceAll(Math::multiplyExact); // 将每个数字乘以2
这里 Math::multiplyExact 代替了 x -> Math.multiplyExact(x, 2)。
- 类::实例方法名
Map<String, String> map = new HashMap<>();
map.computeIfAbsent("a", String::toUpperCase);
这里 String::toUpperCase 代替了 key -> key.toUpperCase()。