lambda stream Future

java8实战 随笔摘抄备忘

 

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个元素

 

映射

mapflatmap方法,类似于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-
>
。你需要让生成的流扁平化,以得到一个Stream。这
正是flatMap所做的:
List numbers1 = Arrays.asList(1, 2, 3);
List numbers2 = Arrays.asList(3, 4);
List pairs =
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 numbers1 = Arrays.asList(1, 2, 3);
List numbers2 = Arrays.asList(3, 4);
List pairs =
numbers1.stream()
.flatMap(i ->
numbers2.stream()

.filter(j -> (i + j) % 3 == 0)
.map(j -> new int[]{i, j})
)
.collect(toList());

其结果是[(2, 4), (3, 3)]

你可能感兴趣的:(java,stream,java8,Future,Function)