Java基础——Lambda表达式

来源:互联网 发布:ubuntu docker 启动 编辑:程序博客网 时间:2024/06/09 17:16

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);    }}
0 0