- java 8 Stream 流式编程
- 一、stream 概要与使用场景
- stream 概要
- Lambda 表达式详解
- stream
- 额外学习
-
stream 流式编程是用于对集合迭代器的增强,使之能完成更高效的去和 *** 作(过滤、排序、统计分组)或者大批量数据 *** 作。此外 steam 与 lambada 表达式结合后编码效率大大提高,并且可读性更强。
-
stream 里面有多线程
-
产生背景
-
获取所有红色苹果的总重量,如果用sql其实非常好实现,为什么不直接在关系数据库中实现呢?
select sum(a.wight) from apple as a where a.color='red' // 获取所有红色苹果重量 select a.color,sum(a.weight) from apple as a group by color;
-
传统的java ee项目数据源比较单一,可以这样做。但是现在的项目数据源多样化:关系数据库,Nosql,Redis,ElasticSearch等这是就需要我们从个数据源中汇总数据进行统计。这在stream出现前只能通过便利实现,非常繁琐
-
-
Lambda 简介 :
- 也称闭包,推动java 8 发布最重要的特性,Lambada 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。使用Lambada表达式可以使函数变得更加间接紧凑。
-
-
这个实现其实在底层式一样的,lambda表达式在编译的时候会生成匿名内部类
-
函数式接口才能使用lambda,即才能把函数作为参数传递进去
-
说明:new Thread 时需要传入一个匿名内部类,这个匿名内部类是runable接口,他是一个函数式接口,所以可以将他替换为lambda表达式进行传输,传输的参数其实就是run方法的参数,箭头后面就是run方法的实现。
-
说明:Formatter是一个函数式接口,print方法有一个参数是这个函数式接口,所有在嗲用这个方法时传递的参数就可以将此函数式接口替换为lambda表达式,而lambda表达式是一个函数,所以这个函数其实就是实现的函数式接口里面的format方法。这其实就是一个匿名内部类,即new 出来一个Formatter但是没有名字,所以他的this是继承来的。
-
-
流的生成 :stream()
-
流不可重复使用 :生成一个流stream1后,添加一个节点filter,这时stream1+filter形成了一个新的流stream2,原来的stream1作废,不能再stream1后再添加节点,只能在stream2后再添加节点。即stream流是不允许有分叉的。
-
中间节点和中止节点:看stream类中方法,如果返回的是stream,则一般就是中间节点;否则是中止节点
- 中间节点可以有很多个,用来构造pipeline,且是懒节点,只有调用中止节点时才会执行
- 中止节点只能有一个,调用中止节点时会立刻执行。
-
流的执行过程是一个数据一个数据的传递,而不是直接将整个数组list传递过去
-
filter :过滤节点,中间节点,传入箭头函数,参数a代表stream流中每次传进来的数据(其实就是i函数的参数),箭头就相当于将a传入方法体中,因为只有一条语句,可以省略方法体的{}和return。如果方法体中的判断条件返回true,则将此数据加入新生成的数组中。
-
map :映射节点,中间节点,也是传入箭头函数,将过滤下来的apple传进去后,返回颜色string类型,在接下来的节点中都是string类型的数据。
-
distinct():去重,将返回的所有的数据进行比较去重,只留下不一样的元素。
-
peek():中间节点,用来执行传入的函数
-
forEach():中止节点,与peek()作用一样,只不过这是个中止节点。单纯用来执行传入的箭头函数。
-
collect():采集,常用,中止节点。可以用于以下用途:
- list :collect(Collectors.toList())
- map:collect(Collectors.toMap(a->a.getColor(), a->a, (a1,a2)->a1)) // 第一个参数是key,第二个参数是value,如果有重复的key应该添加第三个参数进行merge,如果有两个apple a1,a2,则在里面选一个a1
- group by
- 数组
- 求出最大值
- 求任意值
-
stream debug
- idea 自带工具 Trace Current Stream Chain
Mapmaps new Hash<>(); //如果不存在这个key,则new 一个这个key,并返回其value对应的数据类型 List lsit = maps.computeIfAbsent(apple.getColor(),key->new ArrayList<>());
-
要想真正搞懂一个框架,必须先去了解设计模式
-
coderead.cn 源码阅读网
-
mybatis 和 dubbo里面的动态代理都说明使用了同一种设计模式,为了实现透明化,屏蔽底层,从而简化我们的使用
-
lambda study link
-
stream study link
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)