Java知识实践—基础篇(三)

笔记

Posted by Jingming on February 9, 2021

此篇主要记录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类型作为返回结果