码迷,mamicode.com
首页 > 其他好文 > 详细

Other - 06 - Lambda学习笔记 - Lambda

时间:2016-01-17 18:58:16      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

Lambda

    通过上篇我们基本可以看出来 Lambda 是一个行为非常类似匿名内部类的一个东西,而实际上它大部分时候都是在取代匿名内部类来实现更加简洁的语法。

技术分享

    可以看到这是一个简单的使用 Lambda 去代替 Comparator 匿名类来进行排序的例子。
    首先第一是代码变的更加紧凑了,原先需要使用四行半的代码现在半行就搞定,但这不是最重要的,重要的是这种从四行半缩短到半行可以让我们的代码更加容易的进行链式操作。

技术分享

    可以看到如果仍然使用匿名类,那么这个代码就非常的难看了,但是使用 Lambda 就不一样,它非常自然的支持链式的操作,而且这个代码读起来也非常的自然,首先它是一个 Function 函数,它乘以2,andThen 然后再乘以2,andThen 然后再乘以2。相比起前面的匿名类来说可读性也大大提高了。


预定义函数式接口与链式 Lambda

    通过上面的例子我们也基本上看出来了,在一些特定的情况下使用 Lambda 会大大的提高我们代码的可读性,注意是特定条件下,所以合理的判断何时何地如何使用 Lambda 也是一门学问。
    而这里我们还是要介绍一些我们手里有的工具,Java8 提出 Lambda 之后,很自然的也给我们提供了一些函数式接口,有了这些函数式接口的支持,我们的代码就可以变的更加的简洁。

技术分享

    在 java.util.function 包下有非常多的函数式接口,而这里我们列举几个比较常用的。具体每个函数式接口都什么作用直接看参数和返回值就可以确定。

    而在 Java 原生体系中,类似 Runnable / Comparator 等等大量的接口都是函数式接口,而且它们都添加了许多非常有意思的默认方法,可以说通过这些函数式接口完全可以生产出一个非常有意思的 Lambda 来。


方法引用

    Lambda 本身是 Java 对一个函数的抽象,可以说一个 Lambda 是一个函数(扩展一下,产生一个 Lambda 的函数是什么,它是一个产生函数的函数,叫做高阶函数),而在 Java 的类中其实已经有数不清的方法了,它们都应该可以是一个 Lambda 才对,而它们本身却没有实现一个函数式接口,所以提出了方法引用的概念。
    对于任意的一个方法,它可以被特定的规则引用,引用之后它将会被作为一个 Lambda 表达式。

技术分享

    基本上来说有方法引用的支持,我们绝大部分的代码可以变得更加的优雅了,而 Java 也向函数式编程更近了一步。


实践一下

    上面讲了这么多,我们来实践一下。

技术分享

    第一个实践是一个 Supplier 的运用,在实际工作中经常会碰到这样一种东西,一个模型里面嵌套着一个模型,然后一层一层的嵌套,当我其实只是想要最内层的某一个属性的时候,必须得一层一层的剥开这个对象,但是每剥开一层就要小心触发 NullPointerException,这样实在是太费劲了,而且一旦层数很深那就更费事了,所以如果使用这样的一个 Lambda 来处理这个问题,那就显得刚刚好。
    可以看到其实内部执行了这个 Lambda,然后尝试捕获了异常,如果真的是空,那就返回了空,如果没有触发异常就返回真正的值。

技术分享

    第二个实践是对排序的一种改造,在以前如果我们要使用匿名内部类写这种基于两个或者是更多个属性的排序,那么解决方案就是在一个 compare 函数里写上一个个嵌套的 if-else,当排序的属性还比较少的时候还是勉强可以接受的,但是如果是好几个属性那这个代码写起来就比较费劲了。但是如果换成 Lambda 试试呢?其实这个 Lambda 真的是非常的简单,只要你顺着把他念出来,一切都可以明白:首先它是一个 Compatator,它先比较两者的 id,然后比较两者的 age,通俗易懂。
    而这里我们一般都使用了强制转型来限定 Lambda 的类型,因为一旦加入了链式的操作,想要通过编译器来推断 Lambda 的类型是有些困难的了,所以这里直接写出类型来。




Other - 06 - Lambda学习笔记 - Lambda

标签:

原文地址:http://www.cnblogs.com/yaowu/p/d99e15e6e43edb3cf2e5c7b73867a37a.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!