Java Lambda表达式
Lambda表达式简介:
Lambda表达式,也可称为闭包,Java8新特性。
Lambda允许将函数作为一个方法的参数(函数作为参数传递进方法中)。
使用Lambda表达式可以使代码更加简洁紧凑。
尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
Lambda对接口的要求:
虽然使用Lambda表达式可以对某些接口进行简单实现,不是所有的接口都可以使用Lambda表达式来实现。
Lambda规定接口中只有一个必须需要被实现的方法,不是规定接口中只有一个接口。
被default修饰的方法会有默认实现,不是必须实现的方法,不影响Lambda表达式的使用。
@FunctionalInterface注解的作用:
专门用来修饰函数式接口,要求接口中抽象方法只有一个。这个注解一般会和Lambda表达式一起使用。
Lambda基础语法:
语法形式为() -> {}
,其中{}
用来描述方法体,->
为Lambda运算符,读作goes to。
最传统的接口使用方式:
/*
* Main.class
*/
public class Main {
public static void main(String[] args) {
ImpInter impInter = new ImpInter();
impInter.method();
}
}
class ImpInter implements NoReturnNoParam {
@Override
public void method() {
System.out.println("没有返回值,也没有参数");
}
}
/*
* NoReturnNoParam接口
*/
@FunctionalInterface
public interface NoReturnNoParam {
//要求必须实现的抽象方法
void method();
default void mm(){}
}
比较传统的接口使用方式,匿名内部类:
/*
* Main.class
*/
public class Main {
public static void main(String[] args) {
NoReturnNoParam noReturnNoParam = new NoReturnNoParam() {
@Override
public void method() {
System.out.println("没有返回值,也没有参数");
}
};
noReturnNoParam.method();
}
}
规范的Lambda表达式写法:
public class Main {
public static void main(String[] args) {
NoReturnNoParam noReturnNoParam = () -> {
System.out.println("没有返回值,也没有参数");
};
noReturnNoParam.method();
}
}
有参数和返回值的Lambda表达式写法:
/*
* Main.class
*/
public class Main {
public static void main(String[] args) {
//匿名内部类
ReturnTwoParam returnTwoParam = new ReturnTwoParam() {
@Override
public int method(int a, int b) {
System.out.println("param:"+a+"and"+b);
return 1;
}
};
returnTwoParam.method(1,2);
//Lambda表达式
ReturnTwoParam returnTwoParam1 = (int a,int b) -> {
System.out.println("param:"+a+"and"+b);
return 1;
};
int c = returnTwoParam1.method(3,4);
System.out.println(c);
}
}
/*
* ReturnTwoParam接口
*/
@FunctionalInterface
public interface ReturnTwoParam {
int method(int a,int b);
}
简化Lambda表达式写法:
//1、简化参数类型,可以不写参数类型,但必须所有参数类型都不写
ReturnTwoParam returnTwoParam1 = (a,b) -> {
System.out.println("param:"+a+"and"+b);
return 1;
};
int c = returnTwoParam1.method(3,4);
System.out.println(c);
//2、简化参数小括号,如果只有一个参数,则可以省略参数小括号
ReturnOneParam returnOneParam1 = a -> {
System.out.println("param:"+a);
return 1;
};
int c = returnOneParam1.method(3);
System.out.println(c);
//3、简化方法体大括号,如果方法只有一条语句,则可以省略方法体大括号
NoReturnNoParam noReturnNoParam = () -> System.out.println("没有返回值,也没有参数");
noReturnNoParam.method();
//4、如果方法体只有一条语句,并且是return语句,则可以省略方法体大括号
ReturnOneParam returnOneParam = a -> a+4;
returnOneParam.method();