此篇主要记录Java8。
Lambda
含义
Lambda就是对一种数学计算过程的抽象。
在Java中实现原理
Java中的Lambda实现起来原理是匿名类、匿名方法。
语法理解
语法的两种形式:(参数1,参数2,…) -> { 语句; } 或者(参数1,参数2,…) -> 表达式
其中,(1)一个参数无需定义圆括号 (2)表达式的结果会作为最终结果返回 (3)参数的形式不需要提前定义,因为在使用Lambda的时候,JVM可以从当前上下文环境推导出来 (4) 也可以明确定义参数类型
Lambda访问限制
Lambda内部计算的时候,会把外部的局部变量当作只读的,但是可以读写外部静态变量和成员变量。
函数式接口
在包java.util.function中。
函数式接口使用的地方可以传入lambda”对象”。
理解
函数式接口的意思是对接口做更严格的限制:要求其中的有且仅有一个抽象方法(可以被实现),但可以有多个非抽象方法。
限制带来的好处是,可以和lambda表达式进行隐式转换(因为语义上等价,编程时非常直观的一点就是一个接口对象指向一个lambda)。
在接口定义上加上@FunctionalInterface就会使得接口变为函数式接口。
常见函数式接口:
接口 | 描述 | 说明 |
---|---|---|
Function | 接收一个参数,返回单一结果 | 说白了,就是 (x) -> { 语句处理x; return 结果;} |
Supplier | 无需接收参数,但是会提供返回结果 | () -> { return 结果;} |
Consumer | 需要接收参数,但是没有返回结果 | (x) -> { 语句;} |
Predicate | 接受一个参数返回一个布尔值 | 用于过滤,将Predicate的方法执行放入if语句中,true才选择 |
Stream
Stream最大的好处,就是减少了大量的显示循环代码(原理是visitor模式,在Stream内部循环,外面只要提供lambda就好)。
Stream使用管道操作,也就是说,使用一个函数进行Stream一次操作(遍历)后,
得出下一层的输入Stream,然后继续,最后一层的stream作为结果。直观上看,从左到右一步步执行方法。
注意:(1)先解析整个语句,之后在从左到右一步步执行方法,而不是一上来就从左向右执行 (2)还有并行流技术
函数介绍:
函数 | 说明 |
---|---|
filter | 使用Predicate接口实现??也就是把满足过滤条件的元素去掉 |
sort | 排序,传入的是比较大小的lambda |
map | 变形,也就是真正的逻辑运算得出要的结果,需要注意的是,得出的结果的类型也是可以和输入Stream里面的元素类型不同的 |
collect | 规约操作,可以把Stream里面的多个元素,通过计算压缩成一个元素或者一个集合,例如求和就是压成一个元素。Collectors里面实现了很多规约操作,Collectors.toList()意思就是转成List类型作为返回结果 |