Java基础——Lambda表达式

Lambda表达式是Java8的重要更新。Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。

首先,我们先使用匿名内部类来写一个例子,然后对比Lambda表达式。
先写一个接口:

public interface Command {

    //接口里定义的process方法用于封装“处理行为”
    void process(int[] target);
}

匿名内部类:

public class CommandTest {

    public static void main(String[] args){
        ProcessArray pa = new ProcessArray();
        int[] target = {3,-4,6,4};
        //处理数组,具体处理行为取决于匿名内部类

        pa.process(target, new Command(){

            @Override
            public void process(int[] target) {
                // TODO 自动生成的方法存根
                int sum = 0;
                for(int tmp : target){
                    sum += tmp;
                }
                System.out.println("数组元素的总和是:" + sum);
            }

        });
    }
}

Lambda表达式:

public class CommandTest2 {

    public static void main(String[] args){
        ProcessArray pa = new ProcessArray();
        int[] array = {3,-4,6,4};
        pa.process(array, (int[] target)->{
            int sum = 0;
            for(int tmp : target){
                sum += tmp;
            }
            System.out.println("数组元素的总和:" + sum);
        });
    }
}

由上面可以看出,Lambda表达式简化创建匿名内部类对象。

Lambda表达式的主要作用就是代替匿名内部类的繁琐语法。它由三部分组成。
——形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
——箭头(->)。必须通过英文中画线和大于符号组成。
——代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda代码块中只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

Lambda表达式的几种简化写法:

interface Eatable{
    void taste();
}
interface Flyable{
    void fly(String weather);
}
interface Addable{
    int add(int a, int b);
}
public class LambdaQs {
    //调用该方法需要Eatable对象
    public void eat(Eatable e){
        System.out.println("我在吃苹果");
        e.taste();
    }
    //调用该方法需要Flyable对象
    public void drive(Flyable f){
        System.out.println("我正在驾驶:" + f);
        f.fly("【碧空如洗的晴空】");
    }
    //调用该方法需要Addable对象
    public void test(Addable add){
        System.out.println("5与3的和为:" + add.add(5, 3));
    }
    public static void main(String[] args){
        LambdaQs lq = new LambdaQs();
        //Lambda表达式的代码块只有一条语句,可以省略花括号
        lq.eat(()->System.out.println("苹果的味道不错!"));
        //Lambda表达式的形参列表只有一个形参,可以省略圆括号
        lq.drive(weather->{
            System.out.println("今天的天气是:" + weather);
            System.out.println("直升机飞行平稳");
        });
        //Lambda表达式的代码块只有一条语句,可以省略花括号
        //代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字
        lq.test((a,b)->a + b);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章