Java 8新增的Lambda表达式

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

下面我将采用匿名内部类与Lambda表达式分别处理同样的代码:

Command.java:
package Lambda;

public interface Command {

    void process(int[] target);
}
ProcessArray.java
package Lambda;

public class ProcessArray {

    public void process(int[] target,Command cmd){
        cmd.process(target);
    }
}
CommandTest.java
package Lambda;

public class CommandTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

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

        });
        """
        /*pa.process(target, new Command()
                {
                    public void process(int[] target){
                        int sum = 0;
                        for(int tmp : target){
                            sum += tmp;
                        }
                        System.out.println("数组元素的总和是:" + sum);
                    }
                });*/
    }

}

其中屏蔽掉的部分便是匿名内部类,高亮部分是Lambda表达式。
可以看到Lambda表达式代码与创建匿名内部类代码完全相同,只是不需要new Xxx(){}这种繁琐的代码,不需要指出重写的方法的名字,也不需要给出重写方法的返回值类型——只要写出重写方法的方法括号以及括号里的形参列表即可。


如果你还是觉得Lambda很繁琐,别着急,下面还有几种Lambda的简化方法。

Eatable.java
package EasyLambda;

public interface Eatable {

    void taste();
}
Flyable.java
package EasyLambda;

public interface Flyable {

    void fly(String weather);
}
Addable.java
package EasyLambda;

public interface Addable {

    int add(int a,int b);
}
LambdaQs.java
package EasyLambda;

public class LambdaQs {

    public void eat(Eatable e){
        System.out.println(e);
        e.taste();
    }

    public void dvive(Flyable f){
        System.out.println("我正在驾驶:" + f);
        f.fly("【碧空如洗的晴日】");
    }

    public void test(Addable a){
        System.out.println("5和3的和为:" + a.add(5, 3));
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        LambdaQs lq = new LambdaQs();
        //Lambda表达式的代码块只有一条语句,可以省略花括号
        """
        lq.eat(() -> System.out.println("苹果的味道不错!"));//括号中为形参列表
        //Lambda表达式的形参列表只有一个形参,可以省略圆括号
        lq.dvive(weather ->
        {
            System.out.println("今天的天气是:" + weather);
            System.out.println("直升机飞行平稳");
        });
        //lambda表达式的代码块只有一条语句,可以省略花括号
        //代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字
        lq.test((a,b)->a + b);
        """
    }

}

上述程序中调用了eat()方法,drive()方法,test()方法,但是调用这些方法需要的参数实际上都是Lambda表达式。

// 1. 不需要参数,返回值为 5
() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值