重新认识jdk8的lambda表达式

为什么jdk8引入lambda?

对于这这个问题,我相信学习过jdk8新特性的朋友会给出我一大堆的答案,但是我想问的是你真的理解你所说的答案吗?对于官方给的lambda一大堆好处,我是真的没有搞太懂。现在我只从我的视角来理解一下什么lambda,以及为什么引入这个玩意。

    List<User> userList=...
     Collections.sort(userList, new Comparator<User>(){
        @ Override
        public int compare(User a, User b) {

            return b.getId().compareTo(a.getId());// 逆序
        }
    });

这一段是我们经常见的排序。我们将Comparator 实例传给sort方法,然后通过comparator实例回调compare方法,从而起到排序的功效。那么问题来了,我们为什么需要那个comparator实例?在我刚刚的描述之中,可知comparator实例的作用就是起到调用compare方法的作用,除此之外没有任何作用。那么我们真的需要这个comparator实例吗?

comparator实例存在的价值?

在jdk8之前,我们是需要comparator实例的。原因是java语法体系所致。因为在之前的java体系中函数而非一等公民。那么什么是一等公民?在javascript中我们经常见到如下代码

("#saveBtn").on('click',function(){
        // 在这里作你想作的任何事情
});

那个function即为一等公民,即可以直接被调用的function,而不必再找一个对象包裹它,然后回调。一句话java的语法太麻烦,需要化简。

java语法的化简

java语法需要化简,那么如何化简呢?即lambda表达式。但是这样说,还是不太明确。换个说法,对于sort方法, 我们本不需要comparator实例。在这个sort方法中,其实我们只需一个排序的方式即那个compare方法。

再深入一点,其实我们也不需要compare方法(即这个名字一定是compare),而我们只是需要该方法体中

return b.getId().compareTo(a.getId());// 逆序

而lambda给我们的答案也正是这样

Collections.sort(userList,(a,b)->{
        return b.getId().compareTo(a.getId());
    });

这就是lambda表达式。

lambda表达式的含义

lambda表达式,在我们的上个例子中,就是将排序的函数,作为参数传递给了sort这个函数,而非传递一个对象实例。这样就变像的将函数在jdk8中作为一等公民对待。即在jdk8中函数也是一等公民,即可以作为参数传递给其他函数进行调用。

猜你喜欢

转载自blog.csdn.net/zhurhyme/article/details/81065616