方法引用:使用::分隔符实现方法引用
对Lambda表达式不熟悉的可以看这:https://blog.csdn.net/wuud__/article/details/104703443
可以使用方法引用的情况:
- (args) -> ClassName.staticMethod(args)可以简化为:ClassName::staticMethod。函数式接口内方法的参数与要引用方法的参数完全一致
- (arg,rest) -> arg.instanceMethod(rest)可以简化为:ClassName::instanceMethod。arg是ClassName类型。例:
(list,element) -> list.contains(element);
简化为:List::contains;
- (args) -> expr.instanceMethod(args)简化为expr::instanceMethod。
具体使用:
- Lambda表达式调用类静态方法
@FunctionalInterface
public interface FunctionalInterfaceTest {
void add(String s);
}
public class LambdaTest {
public static void print(String s) {
System.out.println("类静态方法:"+s);
}
public static void main(String[] args) {
FunctionalInterfaceTest fit = (s) -> {
LambdaTest.print(s); // 调用类静态方法
};
fit.add("sss");
// 简介写法
FunctionalInterfaceTest fit = s -> LambdaTest.print(s);
// 还可更简洁,使用<类名::类方法>格式
FunctionalInterfaceTest fit = LambdaTest::print; // 需要类方法的参数个数与函数式接口的参数个数相同
}
}
- 使用Lambda表达式调用实例方法的格式与调用类方法的格式相同
LambdaTest lt =new LambdaTest();
FunctionalInterfaceTest fit = lt::s; // 格式为<实例::实例方法>
public void s(String s1,String s2) {
System.out.println("实例方法"+s1+s2);
}
构造方法引用:
- 无参构造,可以利用Supplier接口实现,因为Supplier接口的抽象方法无需参数。
Supplier<Apple> s = Apple::new;
Apple a = s.get();
- 一个参数的构造方法,可以使用Function接口实现。Function只需一个参数,刚好对应。
public Apple(Integer weight){
this.weight = weight;
}
Function<Integer,Apple> f = Apple::new;
Apple a = f.apply();
- 对应两个参数的可以使用BiFunction,两个以上可以自定义函数式接口。用法相同。