很久没有写/看java代码了,java10都出了….为了观看源码方便,还是认真补一下java中的λ表达式,顺便推荐
The little Schemer入门函数式编程,感觉这个趋势还是很明显的.
0x00.前言
λ这个东西在PL或者计算机中的名气极大,来源以后再补充介绍.这里先看java对它的支持跟特点,简单来说,以前的java是很标准的OOP,缺乏灵动性.也比较冗长.一直被诟病,那么公认来说 : λ的引入,取代了之前java的匿名类写法. 允许把函数当做数据传递,使得代码更优雅精炼.
和泛型一样,初看λ表达式可能觉得有点唬人,不想去用.但是实战几次之后应该就会喜欢上它了~~
0x01.什么是FP
FP简单说是函数(行为)参数化,那么这可能不好理解,我的方法是,先看看它的对立面 : 值参数化. 举个例子
0x02.λ语法
1 | //无需声明参数类型,多个参数才需要圆括号 |
首先说一下我们用λ的几大场景:
- 取代匿名类
- 快速迭代集合
- 函数式编程
- 配合流(stream)优雅处理数据
- 优雅处理null检查(配合Optional)
0x03.实战λ
先看看简单的例子:
1 | /*需求1: 设计一个简易计算器 |
上面的例子还不够直接说明λ的优势么? 可能会觉得不够常用,因为没有跟Stream结合起来, 我们一般写代码最多的业务本质是CURD,那么不可避免大量用到集合,以及对集合的操作(最常见比如遍历). 以前我想遍历一个字符串list,需要先接受,然后写一个for-each循环体,:
1 | List<String> list = Arrays.asList("a_1","0xoo",":",""); |
λ的入门就到这就ok了,之后看代码的时候多试试多思考一下. 关于流的东西,之后会单独讲,这里只是借用一下.可以从上看出,λ配合函数式编程的简单优雅,以后操作各种集合就不用到用危险的方法切割list,合并list了….(且臃肿)
特点:
- λ在java又被称为匿名函数或闭包. (闭包本质也是一种函数),但是其实本质还是有区别的.
- Java编译器将lambda表达式编译成**类的私有方法**
- λ大部分还是语法糖的存在,底层性能大部分情况来说,不会有提高(待考证,也有可能降低一点?)
但是,这只是初入门λ的语法和使用,真正要用好λ,还需要知道很多东西,包括语法糖到底如何实现.为了实现λ就真的很容易么? 还需要做哪些相对的兼容? 这些待后续看函数式接口与Stream流式编程再详细说明.
0x0n.参考
其实单纯谈λ表达式,很难全面的理解.理解它应该系统的从FP(函数式编程)说.那么,Java8是怎么支持函数编程的呢?主要有三个核心概念,之后会一一详细说明.把它们组合起来能使我们的java代码优雅,通用很多: (特别是跟泛型结合起来)
- 函数接口(Function)
- 流(Stream)
- 聚合器(Collector)