java 8 Stream中操作类型和peek的使用
目录
java 8 Stream中操作类型和peek的使用 简介java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢? 我们看一个peek的例子:
上面的例子中,我们的本意是打印出Stream的值,但实际上没有任何输出。 为什么呢? 中间操作和终止操作一个java 8的stream是由三部分组成的。数据源,零个或一个或多个中间操作,一个或零个终止操作。 中间操作是对数据的加工,注意,中间操作是lazy操作,并不会立马启动,需要等待终止操作才会执行。 终止操作是stream的启动操作,只有加上终止操作,stream才会真正的开始执行。 所以,问题解决了,peek是一个中间操作,所以上面的例子没有任何输出。 peek我们看下peek的文档说明:peek主要被用在debug用途。 我们看下debug用途的使用:
上面的例子输出: @H_301_57@Filtered value: three Mapped value: THREE Filtered value: four Mapped value: FOUR 上面的例子我们输出了stream的中间值,方便我们的调试。 为什么只作为debug使用呢?我们再看一个例子:
上面的例子我们使用peek将element转换成为upper case。然后输出: @H_301_57@one two three four 可以看到stream中的元素并没有被转换成大写格式。 再看一个map的对比:
输出: @H_301_57@ONE TWO THREE FOUR 可以看到map是真正的对元素进行了转换。 当然peek也有例外,假如我们Stream里面是一个对象会怎么样?
输出结果: @H_301_57@10:25:59.784 [main] INFO com.flydean.PeekUsage - [PeekUsage.User(name=kkk),PeekUsage.User(name=kkk),PeekUsage.User(name=kkk)] 我们看到如果是对象的话,实际的结果会被改变。 为什么peek和map有这样的区别呢? 我们看下peek和map的定义:
peek接收一个Consumer,而map接收一个Function。 Consumer是没有返回值的,它只是对Stream中的元素进行某些操作,但是操作之后的数据并不返回到Stream中,所以Stream中的元素还是原来的元素。 而Function是有返回值的,这意味着对于Stream的元素的所有操作都会作为新的结果返回到Stream中。 这就是为什么peek String不会发生变化而peek Object会发送变化的原因。 结论我们在本文中讲解了stream的两个操作类型,并总结了peek的使用。希望大家能够掌握。 本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/stream-peek
(编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |