当我在流上调用中间操作时,它们是否为每个中间操作创建新的流?
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?
问题来源:Stack Overflow
基本上,函数式编程的概念之一是pure functions确定性的,并且没有所谓的副作用immutability。Streamapi中的所有中间操作都是不可变的,并返回新的Stream。
作为中提到Oracle的文件,所有的中间业务的一样filter,map和等返回新流。例如map方法文件如下:
Stream<R> map(Function<? super T,? extends R> mapper)
返回一个流,该流包含将给定函数应用于此流的元素的结果。这是一个中间操作。 类型参数:R-新流的元素类型参数: 映射器-应用于每个元素的无干扰,无状态函数 返回: 新流
有关更多信息,您可以看一下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));
}
};
}
};
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。