当我在流上调用中间操作时,它们是否为每个中间操作创建新的流?
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
。 Stream
api中的所有中间操作都是不可变的,并返回新的Stream。
如 Oracle
文档中所述,所有中间操作(如filter
,map
等)都会返回新流。例如map
方法的文档如下:
Stream<R> map(Function<? super T,? extends R> mapper)
返回一个流,该流包括将给定函数应用于此流的元素的结果。
这是一个中间操作。
类型参数:
R-新流的元素类型
参数:
映射器-应用于每个元素的无干扰,无状态函数
返回值:
新流
有关更多信息,您可以看一下Java中的Stream实现(例如,返回新
map
的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));
}
};
}
};
}