java 8 Stream 流式编程
一、stream 概要与使用场景
stream 概要
Lambda 表达式详解
-
Lambda 简介 :
- 也称闭包,推动java 8 发布最重要的特性,Lambada 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。使用Lambada表达式可以使函数变得更加间接紧凑。
-
-
这个实现其实在底层式一样的,lambda表达式在编译的时候会生成匿名内部类 -
只能有一个方法 -> 函数式接口 -> @FunctionalInterface -> object下的方法除外 -
函数式接口才能使用lambda,即才能把函数作为参数传递进去 -
说明:new Thread 时需要传入一个匿名内部类,这个匿名内部类是runable接口,他是一个函数式接口,所以可以将他替换为lambda表达式进行传输,传输的参数其实就是run方法的参数,箭头后面就是run方法的实现。 -
-
说明:Formatter是一个函数式接口,print方法有一个参数是这个函数式接口,所有在嗲用这个方法时传递的参数就可以将此函数式接口替换为lambda表达式,而lambda表达式是一个函数,所以这个函数其实就是实现的函数式接口里面的format方法。这其实就是一个匿名内部类,即new 出来一个Formatter但是没有名字,所以他的this是继承来的。
stream
-
流的生成 :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
额外学习
Map<String,List<Apple>> maps new Hash<>();
List<apple> lsit = maps.computeIfAbsent(apple.getColor(),key->new ArrayList<>());
|