地图和mapToObj之间的Java Stream差异

mas*_*ter 34 java java-8 java-stream

我感觉不到Java 8 Streams map()mapToObj()方法之间的区别.在两者中我们都可以创建对象并将对象返回到流,所以为什么这些方法存在为两个,而不仅仅是一个.

你能用例子给我解释一下吗?

Swe*_*per 41

你会看到这种很酷的模式.该Stream课程包括IntStream,LongStream,DoubleStream等,这是为了让您可以在流操作使用原始的类型.因为否则你必须使用Stream<Integer>Stream<Double>,它将包装值.

同样,这些map方法也可以做到这一点.在Stream<T>类中,有mapToInt,mapToDouble方法,但这种情况是在一点点不同IntStream,DoubleStream类别.

IntStream,该map方法采用a IntUnaryOperator,将int映射到int.如果要将流映射到a Stream<T>,则必须使用mapToObj.mapToObj是一个好名字,因为它区别于map映射到整数.它表示流从a IntStream变为a Stream<T>.这样mapToObj命名的原因与为什么这样命名的原因相同mapToInt- 表示Stream类型的变化/

  • 你可以添加一个`boxed()`方法,它在例如`IntStream`和`Stream <Integer>`之间传递并适合这种模式. (6认同)

Ale*_*amo 20

primitiveobject数据类型(如int和整型,双精度和双等)的版本与在Java中互相兼容真的.通过额外的步骤使它们兼容auto-boxing/unboxing.因此,如果您有一个原始整数流,并且如果您尝试使用Stream和Function的对象版本(即流和函数,则会产生装箱和拆箱元素的成本.

为了消除这个问题,功能包包含primitive specialized versions of streams以及functional interfaces.例如,Stream<Integer>您应该使用而不是使用IntStream.您现在可以使用IntFunction处理流的每个元素.这将完全避免自动装箱/拆箱.

因此,每当您想要处理原始元素流时,您应该使用原始专用流(即IntStream,LongStream和DoubleStream)和原始专用功能接口(即IntFunction,IntConsumer,IntSupplier等)来实现更好的性能.

还需要注意的是,没有任何原始的专用功能接口(例如IntFunction,DoubleFunction或IntConsumer)扩展非原始功能接口(即Function,Consumer等).

java.util.function package包含所有功能接口的int,double和long(但没有float)版本.例如,有一个IntFunction,一个DoubleFunction和一个LongFunction,它们是Function的int,double和long版本.这些函数与流的原始专用版本一起使用,例如IntStream,DoubleStream和LongStream.

我们来举一些例子:

Stream stream = Stream.of(1, 2, 3); //Will compile fine
IntStream intStream = IntStream.of(4, 5, 6); //Will compile fine

Stream s = IntStream.of(4, 5, 6); //Does not compile
Stream s = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed
IntStream is = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed
Run Code Online (Sandbox Code Playgroud)

作为结论,您可能使用的原因与您可能使用的原因mapToObj相同mapToInt,即更改Stream类型.