Lambda Expression in Java 8

本文探讨了Java 8引入的Lambda表达式特性,通过一个简单的示例展示了从匿名内部类到Lambda表达式的演变过程,强调了Lambda表达式的简洁性和优势。在编译后的class文件中,Lambda表达式不再产生额外的$.class文件,使得代码更加整洁。当接口包含多个方法时,Lambda表达式能更直观地表示方法实现。
摘要由CSDN通过智能技术生成

在上一篇中最后 forEach(): 用到了 Lambda expression,这是 jdk1.8 的新特性。

List<Integer> values = Arrays.asList(4,2,3);
values.forEach(i -> System.out.println(i));

这里就看它是怎么演变过来的:下面这个 demo 很简单,最终输出 『hello lambda』

interface I{
    void show();
}

class C implements I {
    public void show(){
        System.out.println("hello lambda ");
    }
}
public class LambdaDemo {
    public static void main(String... args){
        I obj = new C();
        obj.show(); // 输出 hello lambda
    }
}

我们先看一眼编译后的 class 文件都有哪些:
这里写图片描述

一眼就看明白了,没有什么特别的。

因为class C 只是简单的实现了 interface I , 所以可以直接这么写:使用了Anonymous Inner class

interface I{
    void show();
}

//class C implements I {
//    public void show(){
//        System.out.println("hello lambda ");
//    }
//}
public class LambdaDemo {
    public static void main(String... args){
        I obj = new I(){
            public void show(){
                System.out.println("hello lambda ");
            }
        };
        obj.show();
    }
}

然后这个时候再看一下编译后的 class 文件:
这里写图片描述
这里的Anonymous Inner class 的名字就是最后一个叫:LambdaDemo$1.class

ok, 我们继续

当我们去implements一个interface 再去 rewrite 一个 method 的时候,我们需要考虑的是这个 method的 name , 它的参数列表以及它的 返回值类型,所以在上面的interface I 中已有了 void show(),为什么我还要在下面的实现里再写一遍 public void show() 呢,这样的重复劳动一点也不好。所以下面的
这里写图片描述
这个时候得到就是:用『->』来代替。

public class LambdaDemo {
    public static void main(String... args){
        I obj = () -> {
                System.out.println("hello lambda ");
            };

        obj.show();
    }
}

当 lambda expression 后面只有一行的时候,是可以把后面的大括号去掉的,所以就变成这样:

public class LambdaDemo {
    public static void main(String... args){

        I obj = () -> System.out.println("hello lambda ");

        obj.show();
    }
}

看起来是不是好看多了,也简洁多了,但是这个时候注意一下看它的 class 文件:
这里写图片描述
看到了吧,很干净,再也没有那个$.class 了。这是 lambda expression 的一个 advantage。awesome !

所以如果当interface I 中的 添加一个 show(int i)有参数的方法时,这个时候的 lambda expression 就可以写成这样了:

I obj = i -> System.out.println("hello lambda " + i);
obj.show(9); 

后面这一部分(i -> System.out.println("hello lambda " + i);)是不是很面熟:

List<Integer> values = Arrays.asList(4,2,3);
values.forEach(i -> System.out.println(i));

这里的i -> System.out.println("hello lambda " + i);是 interface I 的实现,而 forEach里面的i -> System.out.println(i)是另外一个 interface 实现,叫做Consumer interface,这个 Consumer interface 是做什么的,后面再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值