写在前面
时间回到2008年,JDK8发布,大数据时代的来临,带来了函数式编程思想 --> Scala。同时JDK新增了一些东西,比如:
1.带来了Lambda表达式:简化Java这种面向对象的定义繁琐,在处理各种数学运算时,频繁需要定义类,对象,方法之类的操作。
2.出现了default普通方法:它出现的目的是为了修正JDK上古版本接口中拓展方法使用的,不常用。
3.出现了函数式接口:一个接口有且只有一个抽象方法,这种解口称之为函数式接口。
可以使用 @FunctionalInterface 注解 检查当前接口是否只包含一个抽象方法。
Lambda表达式
能使用Lambda表达式的前提就是接口必须是函数式接口,只有惟一的一个抽象方法
Lambda表达式的前身---匿名内部类
@FunctionalInterface
interface FunInterface {
void test();
}
public class LambdaTest {
public static void main(String[] args) {
fun(new FunInterface() {
@Override
public void test() {
System.out.println("匿名内部类的方式实现了FunInterface接口");
}
});
fun(() ->{
System.out.println("Lambda表达式的方式实现了FunInterface接口");
});
}
public static void fun(FunInterface fi){
fi.test();
}
}
Lambda表达式中()表示复写的接口中的方法,()里面有无参数由接口决定。{ } 表示匿名内部类实现了 FunInterface接口。{ }中表示了方法体。
Lambda表达式把匿名内部类中多余的new方法定义之类的全都省略了,只保留了方法的参数和方法体的实现!!
Lambda表达式的四种情况–对应抽象方法的四种分支
1.无返回值无参数
public class AllLambda {
public static void main(String[] args) {
//1.无返回值无参数
NoparaNoReturn doubleNo = () -> {
System.out.println("无返回值,无参数的接口对象");
};
doubleNo.test();
}
}
interface NoparaNoReturn {
void test();
}
规则一:若方法体只有一行代码,可以省略{ }
//规则一:若方法体只有一行代码,可以省略{ }
NoparaNoReturn doubleNo = () -> System.out.println("无返回值无参数的Lambda表达式");
doubleNo.test();
2.无返回值有参数
public class AllLambda {
public static void main(String[] args) {
//2.无返回值有参数
HasparaNoReturn hasparaNoReturn = (int x) -> {
System.out.println("无返回值,有参数的接口对象");
x += 20;
System.out.println(x);
};
hasparaNoReturn.test(10);
}
}
interface HasparaNoReturn {
void test(int a);
}
规则二:若方法的参数只有一个,可以省略小括号
规则三:可以省略Lambda表达式中参数的类型,若省略类型,都需要省略。
//规则二:若方法的参数只有一个,可以省略小括号
//规则三:可以省略Lambda表达式中参数的类型,若省略类型,都需要省略。
HasparaNoReturn hasparaNoReturn1 = x -> {
System.out.println("无返回值,有参数的接口对象");
x += 20;
System.out.println(x);
};
hasparaNoReturn1.test(10);
其中X的类型由接口中的抽象方法中的类型决定。
3.有返回值无参数
public class AllLambda {
public static void main(String[] args) {
//3.有返回值无参数
NoparaHasReturn noparaHasReturn = () -> {
int a = 10;
int b = 20;
return a + b;
};
System.out.println(noparaHasReturn.test());
}
}
interface NoparaHasReturn {
int test();
}
规则四:若抽象方法存在返回值且覆写的方法体只有一行,此时方法体的大括号,return都能省略。
//规则4.若抽象方法存在返回值且覆写的方法体只有一行,此时方法体的大括号,return都能省略
NoparaHasReturn noparaHasReturn1 = () -> 10 + 20;
System.out.println(noparaHasReturn1.test());
4.有返回值有参数
public class AllLambda {
public static void main(String[] args) {
//4.有返回值有参数
HasparaHasReturn hasparaHasReturn = (x,y) -> x += y;
System.out.println(hasparaHasReturn.test(20,30));
}
}
interface HasparaHasReturn {
int test(int a, int b);
}