(1)成员方法的介绍
public class Demo {
public static void printString(Printable p){
p.print("aaa");
}
public static void main(String[] args) {
//用于printString方法中传递的参数是一个函数式接口,所以可以使用Lambda表达式对参数进行传递
printString(s->System.out.println(s));
/*
* 分析:
* 在本案例中,Lambda表达式的目的就是传递需要打印的字符串
* 把参数s,传递给了System.out对象,调用该对象中的方法println方法对参数进行输出
* 注意;
* (1)System.out对象已经存在
* (2)println方法也已经存在
* 所以我们可以使用方法引用来优化Lambda表达式
* 可以使用System.out对象来直接引用out方法
* */
//使用方法引用来优化上述Lambda表达式
printString(System.out::println);
/*
* 上式中,双冒号【::】为引用运算符,它所在的表达式为方法引用,如果Lambda表达式想要表达的函数方案已经存在于某个方法的实现中,那么可以通过双冒号来引用该方法,作为Lambda的替代则
* 上式之前的Lambda表达式中,所重写的接口中的抽象方法的实现代码,在System.out对象中已经存在,即println方法,因此Lambda表达式完全可以由方法引用所替代,
* 对比如下:
* Lambda表达式:s->System.out.println(s);含义:拿到参数后,经过Lambda表达式将参数传递给接口的实现类进行处理,即使用System.out.println(s)进行打印
} 方法引用的表达式:System.out::println 含义:直接用System.out对象中的println方法来替代Lambda表达式,实质上是复用其它类中现有的方法,避免了自己重写
*
* 注:Lambd表达式中传递的参数一定是方法引用中,被引用的方法可以接收的参数类型,否则会报错
* */
}
}
(2)函数式接口
@FunctionalInterface
public interface Printable {
public abstract void print(String s);
}