lamda表达式简单的说其目的就是为了替代匿名内部类,因为匿名内部类看起来很臃肿,也可以理解成是一段可以传递的代码。
函数式编程的几个特点:
闭包和高级函数 - 闭包,将函数作为一个对象对待,高级函数--将函数作为参数,作为返回值。
惰性计算 - 表达式绑定在变量上时不进行计算,只在求值表达式需要值时才进行计算,达到延迟计算的效果。
没有副作用 - 函数中不能修改外部变量,传入函数的变量必须是final的。函数时编程,是一段可以完一个任务的代码,如果对外部变量的修改可能导致一些错乱。
Lambda编程的基本语法:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment 1;
statment 2; ... return statmentM ;}
1. 在大多数情况下,编译器可以从上下文中推断出参数类型,所以参数类型可以省略:
(param1, param2, ..., paramN) -> { statment 1;
statment 2; ... return statmentM ;}
2. 当lambda表达式参数只有一个时,小括号可以省略:
param1 -> { statment 1;
statment 2; ... return statmentM ;}
3. 当lambda表达式只包含一条语句时,大括号也可以省略。
param1 -> statment 1;
定义2个函数时接口,一个是2个参数,一个是一个参数:
@FunctionalInterface
public interface LambdaTestInterface {
void test(String a1, String a2);
}
@FunctionalInterface
public interface LambdaTestInterface1 {
void test(String a1);
}
测试类:
package allen.java.JDK18;
public class LamdbaTest {
public static void main(String[] args) {
//内部类模式
LambdaTestInterface t1 = new LambdaTestInterface() {
@Override
public void test(String a1, String a2) {
System.out.println(a1 + " " + a2);
}
};
//标准模式
LambdaTestInterface t2 = (String a1, String a2) -> {
System.out.println(a1 + " " + a2);
};
//省略参数类型
LambdaTestInterface t3 = ( a1, a2) -> {
System.out.println(a1 + " " + a2);
};
//省略大括号
LambdaTestInterface t4 = ( a1, a2) -> System.out.println(a1 + " " + a2);
//省略小括号和括号
LambdaTestInterface1 t5 = a1 -> System.out.println(a1);
test1(t1,"hello", "world");
test1(t2,"hello", "world");
test1(t3,"hello", "world");
test1(t4,"hello", "world");
test2(t5,"hello");
}
public static void test1 (LambdaTestInterface t1,String s1, String s2){
t1.test(s1 ,s2);
}
public static void test2 (LambdaTestInterface1 t1,String s1){
t1.test(s1);
}
}
执行结果:
hello world
hello world
hello world
hello world
hello
Process finished with exit code 0
在上面的例子中,为什么一定要定义一个函数是接口,因为函数是接口是一种方式,lamdba表达式是目的,只有用函数是接口才能实现函数是接口。
为什么要定义方法test1和test2, 因为函数是接口是一个接口不能直接调用,但是可以作为一个参数。
注意这里要转换下思想,比如我要找出一个数组中的最大数,以前是定义好一个方法,然后传入数组,方法返回最大数,这个是方法
现在是定义一个接口函数,接口函数只规定了你这个函数的传入参数类型和返回值类型,功能里面找出最大值的逻辑可以自己去实现并定义成一个函数,需要的地方把这个函数传进去就行了。