Java Streams: Beyond The Basics (lambda and stream)

 

1.Lambda 和 之前的java匿名内部类使用比较

 

 2.jdk8以后编译器类型推断能力更新,对于lambd中变量,能够根据上下文推断类型,丛而省略类型声明,如下图:

 3.lambda表达式被用于functional interface中,例如map,filter等函数,functional interface 有且仅有一个抽象方法,虽然java interface 

引入了default method and statics mothod,实现了“行为”的多继承,而非状态的多继承。lambda表达式 是函数式编程思想的体现,一个lambda一个

函数,几个lamdba可以组合起来用。


4.java stream include three parts: source,intemedial operation, ending operation. only when the end 

 5.创建steam的方法包括如下图:

 

 

 array不是colletion,所以有单独的方法建立stream.  Files.walk()相当于遍历文件操作,bufferdinputstreamreader.relines()也可以产生stream

6.当terminal method called,pipline才生效,所有中间操作会组成一个大的操作集合,它形成了管道的规则,对于stream中过来的每个数据,看看是否符合

这个管道的规则,符合的话会通过管道到最后输出。

7.lambda表达式可以delay execution.以java.util的looger为例,它有几个log等级,每次使用必须设置log leverl是啥,这个level之上的日志才会打印或输出到文件。

下图是两种执行log输出方法的方式,方法1,无论logger对象的level属性是哪个等级,该getsomestatusdata都会执行。而方法2只有在logger level在finest之下时才会获取数据 

 

 

 8.对于外部变量的使用,匿名内部类使用时要求它必须是final的,对于lambda也是。但是Variable used in lambda expression should be final or effectively final,

也就是不一定要显示声明final。下图是一个例子,sourceCount变量在lambda内部调用了,最后也修改了souceCount内部属性的值。好像对于一些list变量也可以,

只要不修改list变量本身地址指向,list里面的值可以改:

 

 

下图为打印每个元素,并统计集合中符合条件的元素个数的范例。这里面有两个teminal操作,一个打印,一个sum。peek适合这种:

  

 

9. stream的reduce战略,和lambda的递归操作,下图的任务是找出file中最长的一行。X代表每次操作的result,y代表下一个元素。

reduce()方法将一个Stream的每个元素依次作用于BinaryOperator,并将结果合并。

 10.Functional interface 只能有一个抽象方法,可以有默认方法,例如and then,接口名就是function名,lambda表达式就是接口方法的实现。

例如Consumer<List<String>> c=(List<String s)->{s.clear()};  c.accept(xxx);lambda表达式实现了comsumer接口的accept方法,接收参数List,

执行相关操作。(List<String s)->{s.clear()}; 可以简化为List:clear,或者 s->s.clear();List:clear的参数就是这个方法的调用者,也就是this.

11.lambda表达式会被转换成一个class,里面一个private statics 方法,然后调用另一个方法,相对有点间接。而method reference,是直接的方法

调用。不过两种方式性能差别很小很小。

12.andThen方法的实现与案例:

 

 c1.andThen(c2)返回的是一个新的consumer,(T t)->{c2.accept(t);c1.accept(t);}

13.感觉comsumer,supplyer,predict,function这4个函数接口,是对函数的一种高层次的抽象,有了这层抽象,

就可以在很多地方直接写comsumer来包括很多函数了,这是接口的好处。同时,andthen方法,又提供了

一种很有用的抽象能力。 

 14.stream()还有parellelstream(),可以带我们轻松的多线程加速。而不用自己写多线程,担心这个担心那个。我们可用它局部加速。

 

posted @ 2021-10-10 19:55  lhlcc  阅读(57)  评论(0)    收藏  举报