在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作
那么考虑一种情况,如果我们在Lambda中所指引的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?
答案肯定是没有必要的
那我们又是如何使用已存在的方案呢?
::该符号为引用运算符,而它所在的表达式被称为方法引用
Lambda表达式:usePrintable(s - > System.out.println(s));
分析:拿到参数s之后通过Lambda表达式,传递给System.out.println方法去处理
方法的引用:usePrintable(System.out::println);
分析:直接使用System.out中的println方法来取代Lambda表达式,代码更加整洁
package Demo;
/*
体验方法的引用:
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作
那么考虑一种情况,如果我们在Lambda中所指引的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?
答案肯定是没有必要的
那我们又是如何使用已存在的方案呢?
需求:
1.定义一个接口(Printable),里面重新定义一个抽象方法;void PrintString(String s);
2.定义一个测试类(PrintableDemo),在测试类中提供两个方法
一个方法是usePrintable(Printable p)
一个方法是主方法,在方法中调用usePrintable方法
方法引用符:
* ::该符号为引用运算符,而它所在的表达式被称为方法引用
* Lambda表达式:usePrintable(s - > System.out.println(s));
分析:拿到参数s之后通过Lambda表达式,传递给System.out.println方法去处理
* 方法的引用:usePrintable(System.out::println);
分析:直接使用System.out中的println方法来取代Lambda表达式,代码更加整洁
推导与省略
* 如果使用Lambda,那么根据"可推导就是可省略"的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
* 如果使用方法引用,也是同样可以根据上下文进行推导
* 方法的引用是Lambda的孪生兄弟
*/
public class PrintableDemo {
public static void main(String[] args) {
//用Lambda表达式写
usePrintable(s -> System.out.println(s));
//用方法的引用进行填写 方法引用符号: ::
usePrintable(System.out::println);
}
private static void usePrintable(Printable p){
p.PrintString("时长两年半的iKun");
}
}
Printable接口
package Demo;
public interface Printable {
void PrintString(String s);
}
输出的内容:
时长两年半的ikun