Stream的peek和map的区别

JDK对两者介绍:
Stream peek(Consumer<? super T> action)
返回由该流的元素组成的流,另外在从生成的流中消耗元素时对每个元素执行提供的操作。

Stream map(Function<? super T,? extends R> mapper)
返回由给定函数应用于此流的元素的结果组成的流。

1.接收的参数不同。
peek接收的参数类型为Consumer,而map接收的参数类型为Function。

@FunctionalInterface public interface Consumer

Consumer接收单个输入参数T但不返回结果的操作,其功能方法是void accept(T t) ,表示将此函数应用于给定的参数。

@FunctionalInterface public interface Function<T,R>

Function接受一个参数并产生结果的函数,也就是有返回值的操作,其功能方法是R apply(T t)
功能也是将此函数应用于给定的参数。区别于Consumer的是其它必须返回值,类型为R(任意),也就是map操作每个单元都必须接收个返回值。

2.用途不全一样
peek: 是个中间操作,它提供了一种对流中所有元素操作的方法。生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;但一般不推荐使用,文档提示:该方法主要用于调试,做一些消耗这个对象但不修改它的东西(发送通知,打印模型等)。SonarLint的提示是:

java.util.Stream.peek()“主要用于支持调试”。虽然这并不意味着不鼓励将peek()用于其他目的,但是在没有仔细考虑的情况下依赖peek()可能会导致容易出错的代码,比如:
如果流管道不包含终端操作,则不会使用任何元素,并且根本不会调用peek()操作。
只要流实现能够达到最后一步,它就可以自由地优化处理,只生成一些元素,甚至根本不生成元素(例如,依赖于其他集合方法来计数元素)。因此,peek()操作将为更少的元素调用,或者根本不调用。
错误举例:
Stream.of(“one”, “two”, “three”, “four”)
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e)); // Noncompliant
j

尽管有些时候IDEA编译会提示你可将map操作转换成peek,但我们最好不要这么做。
peek调试打印流中某操作后的每个元素:

   Stream.of("1", "2", "3", "4") 
	.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());  

map:它的作用就是把 input Stream 的每一个元素,映射成 output Stream 的另外一个元素。常用语使用map将模型转换为其他模型。
List元素转成大写:

List<String> output = Stream.of("a", "b", "c", "d") 
	.map(String::toUpperCase)
	.collect(Collectors.toList());
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值