Java Stream 中 map 方法源码详解
2023-12-30 02:42:03
Java Stream 中 map 方法源码详解
在Java的Stream API中,map方法是用于对流中的每个元素进行映射操作的重要方法。本文将深入解析map方法的源码,探讨其内部实现和机制。
Stream 接口中的 map 方法
首先,让我们看一下Stream接口中map方法的声明:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
这个方法接受一个Function参数,用于定义元素的映射规则。Function是一个函数式接口,其apply方法将元素映射为新的值。
map 方法的实现
map方法的实现同样是在BaseStream接口中定义的。以下是BaseStream接口中关于map方法的默认实现:
default <R> Stream<R> map(Function<? super T, ? extends R> mapper) {
Objects.requireNonNull(mapper);
return (Stream<R>) (isParallel()
? new ReferencePipeline.Head<>(this, StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT, null, OpMap.makeRef(mapper), StreamShape.REFERENCE)
: new ReferencePipeline.Head<>(this, StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT, null, OpMap.makeRef(mapper)));
}
解析这段代码:
Objects.requireNonNull(mapper);:确保传入的mapper不为null,否则抛出NullPointerException。isParallel():检查流是否为并行流。new ReferencePipeline.Head<>:创建一个新的ReferencePipeline.Head对象,表示流的头部操作。如果流是并行的,会传入额外的参数StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT和StreamShape.REFERENCE。OpMap.makeRef(mapper):创建一个表示映射操作的OpMap对象,并将mapper传递给它。
OpMap 类
OpMap类是Stream操作的内部实现之一,用于表示映射操作。以下是关键部分的源码:
final class OpMap<T, U> implements ReferencePipeline.StatefulOp<T, U>, OpMapFactory<T, U> {
// ...
@Override
public <S> Node<U> opEvaluateParallel(PipelineHelper<U> helper, Spliterator<S> spliterator, IntFunction<U[]> generator) {
return Nodes.map(helper, spliterator, true, generator);
}
// ...
}
这段代码展示了OpMap类的一部分实现。它包含一个opEvaluateParallel方法,用于在并行流中进行映射操作。在这里,它调用了Nodes.map方法,这个方法会根据给定的Spliterator在并行环境中执行映射操作。
示例用法
List<String> stringList = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");
Stream<Integer> lengthStream = stringList.stream()
.map(String::length);
lengthStream.forEach(System.out::println);
在这个例子中,我们使用map方法将每个字符串映射为其长度。在实际执行中,map方法会根据传入的Function对流中的元素进行映射,并返回一个新的流。在内部,它会创建一个新的OpMap操作来表示这个映射操作。
文章来源:https://blog.csdn.net/cxkjntm123/article/details/135245379
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!