这篇文章主要介绍了Java 8 Stream操作类型及peek示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
简介
java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢?
我们看一个peek的例子:
Stream stream = Stream.of("one", "two", "three","four");
stream.peek(System.out::println);
上面的例子中,我们的本意是打印出Stream的值,但实际上没有任何输出。
为什么呢?
中间操作和终止操作
一个java 8的stream是由三部分组成的。数据源,零个或一个或多个中间操作,一个或零个终止操作。
中间操作是对数据的加工,注意,中间操作是lazy操作,并不会立马启动,需要等待终止操作才会执行。
终止操作是stream的启动操作,只有加上终止操作,stream才会真正的开始执行。
所以,问题解决了,peek是一个中间操作,所以上面的例子没有任何输出。
peek
我们看下peek的文档说明:peek主要被用在debug用途。我们看下debug用途的使用:Stream.of("one", "two", "three","four").filter(e -> e.length() > 3) .peek(e -> System.out.println("Filtered value: " + e)) .map(String::toupperCase) .peek(e -> System.out.println("Mapped value: " + e)) .collect(Collectors.toList());上面的例子输出:Filtered value: threeMapped value: THREEFiltered value: fourMapped value: FOUR上面的例子我们输出了stream的中间值,方便我们的调试。为什么只作为debug使用呢?我们再看一个例子:Stream.of("one", "two", "three","four").peek(u -> u.toupperCase()).forEach(System.out::println);上面的例子我们使用peek将element转换成为upper case。然后输出:onetwothreefour可以看到stream中的元素并没有被转换成大写格式。再看一个map的对比:Stream.of("one", "two", "three","four").map(u -> u.toupperCase()).forEach(System.out::println);输出:ONETWOTHREEFOUR可以看到map是真正的对元素进行了转换。当然peek也有例外,假如我们Stream里面是一个对象会怎么样?@Data @AllArgsConstructor static class User{ private String name; }List userList=Stream.of(new User("a"),new User("b"),new User("c")).peek(u->u.setName("kkk")).collect(Collectors.toList()); log.info("{}",userList);输出结果: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的定义:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。