1、Lambda表达式
1.1、定义
lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式。它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达式则更为简洁。
1.2、使用
lambda表达式的写法:
(需要实现的方法的参数)->{对于方法的具体实现}
代码展示:
先定义一个函数式接口,并定义方法使用函数式接口。
//函数式接口
interface Cook{
//无参数无返回值的抽象方法
public void cooking(String person);
}
//函数式接口作为方法的参数使用
public static void invokeCook(String person,Cook cook){
cook.cooking(person);
}
若使用匿名内部类进行实现:
//使用匿名内部类实现Cook接口中的方法重写
invokeCook("小明", new Cook() {
@Override
public void cooking(String person) {
System.out.println(person+"快做饭");
}
});
改用lambda表达式优化:
//使用lambda表达式实现Cook接口中的方法重写
invokeCook("小明",(person)->{
System.out.println(person+"快做饭");
});
}
使用lambda表达式传参时,()中所传入的参数名可以不带类型标识符,但参数名必须于函数式接口中的方法的形参名保持一致。当lambda表达式要传递的参数为单参,且实现语句为单句时,可改写为如下形式:
//使用lambda表达式实现Cook接口中的方法重写
invokeCook("小明",person->System.out.println(person+"快做饭");
);
}
1.3、总结
(1) lambda表达式针对于函数式接口使用,使用形式简便,使用范围较小。
(2) lambda表达式是匿名内部类的进一步提炼优化,称为匿名内部类的语法糖。
(3) lambda表达式()中传入的参数是要实现的函数式接口中的抽象方法的形参。
2、方法引用
2.1、定义
方法引用是用来直接访问类或者实例已经存在的方法(注意:不是创建或实现方法)或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。运行时,方法引用会创建函数式接口的一个实例。
2.2、使用
方法引用的写法:类名::已存在的方法
代码展示
先定义一个函数式接口,并定义方法使用函数式接口。
//函数式接口
@FunctionalInterface
interface Printable{
//打印字符串的抽象方法
void printMethod(String s);
}
//定义一个方法,参数传入函数式接口,对字符串进行打印
public static void printString(Printable p){
p.printMethod("hellowrold");
}
若使用匿名内部类进行实现:
//使用匿名内部类实现
printString(new Printable() {
@Override
public void printMethod(String s) {
System.out.println(s);
}
});
改用lambda表达式优化:
//调用printString方法,因为参数是函数式接口,可以使用Lambda表达式
printString((s)->{
System.out.println(s);
});
用方法引用优化:
//使用方法引用
//对象System.out已经存在,方法println也已经存在,
//可直接使用方法引用简化lambda表达式。
printString(System.out::println);
2.3、总结
(1)方法引用仅针对于函数式接口使用,调用函数式接口的抽象方法时,类名::方法表示的就是对于抽象方法的实现代码;调用其他方法时,都是只能调用类中已经存在的方法。
(2)方法引用与lambda表达式相比较,方法引用的使用范围更小,方式更简洁,便于在大量复用
(3)总体而言,方法引用是lambda表达式的语法糖。