Java8六大新特性之一 函数式编程-Lambda表达式

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, 因为函数是接口是一个接口不能直接调用,但是可以作为一个参数。

注意这里要转换下思想,比如我要找出一个数组中的最大数,以前是定义好一个方法,然后传入数组,方法返回最大数,这个是方法
现在是定义一个接口函数,接口函数只规定了你这个函数的传入参数类型和返回值类型,功能里面找出最大值的逻辑可以自己去实现并定义成一个函数,需要的地方把这个函数传进去就行了。

猜你喜欢

转载自blog.csdn.net/pengweismile/article/details/109692537