java - Java 8 Streams 中间操作产生新的流?
问题描述
当我在流上调用中间操作时,它们是否为每个中间操作创建新流?
List<Integer> list = List.of(1,2,3,4,5);
list.stream().filter(i -> i > 4).map(o -> o*2).collect(Collectors.toList());
它创建了多少流?1 还是 3?
解决方案
基本上,函数式编程的概念之一是pure functions
确定性且无副作用,称为immutability
. api 中的所有中间操作Stream
都是不可变的,并返回新的 Stream。
正如Oracle
文档中提到的,所有的中间操作,比如filter
,map
等等都会返回新的流。例如map
方法文档如下:
Stream<R> map(Function<? super T,? extends R> mapper)
返回由将给定函数应用于此流的元素的结果组成的流。这是一个中间操作。
类型参数: R - 新流的元素类型参数:
mapper - 适用于每个元素的无干扰、无状态函数
返回: 新流
有关更多信息,您可以查看 Java 中的 Stream 实现(例如map
返回 new 的方法StatelessOp
)
public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
Objects.requireNonNull(mapper);
return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override
Sink<P_OUT> opWrapSink(int flags, Sink<R> sink) {
return new Sink.ChainedReference<P_OUT, R>(sink) {
@Override
public void accept(P_OUT u) {
downstream.accept(mapper.apply(u));
}
};
}
};
}
推荐阅读
- json - Google 表格:ImportJSON 与请求标头中的键/值对
- dropwizard - 在 dropwizard 中,访问应用程序中任何位置的配置对象的最佳方式是什么
- asp.net-mvc - 修改后的 ClaimsPrincipal 无效
- python - 派生问题 - 如何修复“TypeError:'Add' object is not callable”
- python - 将抓取的列表添加到 Pandas Dataframe
- c++ - 如何从文件中读取输入并将其配对到 C++ 中的映射中
- php - 如何在回声中更改此href?
- java - 将 XML 文档插入 marklogic 数据库时如何编码@符号
- javascript - 如何使用 javascript/jquery 在特定模式后将文本拆分为新行?
- python - 锯齿交易错误:“试图设置未经授权的地址”