1、lamdba有何用
java8出现了lamdba表达式,类似js的箭头函数。有何用?
看个例子 java8之前 一个List的排序,如下的写法是使用匿名类来实现Compartor接口
public static void main(String[] args){
List<String> strList = Arrays.asList("yf1","yf2");
strList.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
lamdba出现后 ,可以改成如下形式
public static void main(String[] args){
List<String> strList = Arrays.asList("yf1","yf2");
strList.sort((o1, o2) -> o1.compareTo(o2));
}
是否很简洁 可读性跟好。
2、如何使用lamdba表达式
基本语法,如下
param -> expression
(param1,param2) -> expression
(type param1,type param2) -> expression
(param1,param2) -> {statements;...}
特点:
a. 省略了接口名称,方法。
b. 参数类型也不是必须的,可以省略
c. 单个语句可以省略{}
d. 方法体内容,一般不建议有多行,3行以内
其中b c缺省的类型 java会在编译时 进行类型推断,根据上下文信息自动识别其类型
(java是强类型语言)
3、函数式接口
函数式接口 : 只有一个抽象方法的接口
只有函数式接口才可以使用lamdba表达式。
注意java8 可以定义有默认实现的方法,这个跟lamdba不冲突,看如下例子
定义函数式接口:
@FunctionalInterface
public interface LamInterface {
void print(String name);
default String getName(){
return "yf";
}
}
测试:
public class LamdbaYf {
public static void testLamdbs(LamInterface lamInterface){
lamInterface.print(lamInterface.getName());
}
public static void main(String[] args){
testLamdbs((name)->System.out.println("my name is = "+name));
}
}
输出:my name is = yf
4、@FunctionalInterface注解
这个注解标识此接口是函数式接口,如果不是,如定义了2个抽象方法。编译会提示报错的
但不是说函数式接口必须使用此注解,即使不使用@FunctionalInterface注解,功能依然不受影响。
5、lamdba表达式与匿名类区别
1、this的使用
匿名类实际还是一个类,在匿名类中使用this 表示的是这个匿名类实例本身。
而在lamdba中使用this ,是指调用lamdba的类实例
2、lamdba是通过invokedynamic jvm虚拟机指令执行的
6、方法引用
TODO
原文:https://www.cnblogs.com/yangfei629/p/11421553.html