lambda基本上是一个没有声明名称的方法
可以十分简明的传递代码
lambda隐含return语句
对于 ()-> 42 这段代码 无入参,但会返回int类型值42
在函数式接口中使用 lambda
lambda表达式为函数式接口的抽象方法提供实现.
lambda表达式可以赋值给一个变量 Runnable r1 = () -> System.out.println("Hello World 1"); -----r1是个变量
lambda表达式可以为函数式接口生成一个实例,然而,lambda表达式本身并不包含它在实现哪个函数式接口的信息.
同样的lambda,不同的函数式接口
自动推断类型,所以入参可以写成 e
lambda使用局部变量
要求:局部变量显示声明为final,或事实上最终的
因为:实例变量存储在堆中,局部变量保存在栈上.(方法保存在栈里,局部变量在方法中)
目的:防止线程不安全
方法引用
方法引用就是让你根据已有的方法实现来创建lambda表达式,方法引用就是lambda表达式的快捷写法
使用流
数值流,文件流,数组流,无限流
filter:结果是两类 一类满足筛选条件,一类不满足筛选条件
筛选各异的元素,就是去重,用distinct方法:
截短流,limit
跳过元素 skip(n)方法.扔掉前n个元素
映射
map和flatmap方法,类似于SQL中选择某一列
map方法会接受一个函数作为参数
map 不光是对对象流进行单字段的“截取”,还可以做“映射”,传一个函数进map(Function f).
流的扁平化 flatmap
flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
例题: (2) 给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应
该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代
表数对。
答案:你可以使用两个map来迭代这两个列表,并生成数对。但这样会返回一个Stream-
正是flatMap所做的:
List
List
List
numbers1.stream()
.flatMap(i -> numbers2.stream()
.map(j -> new int[]{i, j})
)
.collect(toList());
(3) 如何扩展前一个例子,只返回总和能被3整除的数对呢?例如(2, 4)和(3, 3)是可以的。
答案:你在前面看到了, filter可以配合谓词使用来筛选流中的元素。因为在flatMap
操作后,你有了一个代表数对的int[]流,所以你只需要一个谓词来检查总和是否能被3整除
就可以了:
List
List
List
numbers1.stream()
.flatMap(i ->
numbers2.stream()
.filter(j -> (i + j) % 3 == 0)
.map(j -> new int[]{i, j})
)
.collect(toList());
其结果是[(2, 4), (3, 3)]