map和mapToObj之间的Java流差异
我感觉不到Java8流中的map和mapToObj之间的Java流差异,java,java-8,java-stream,Java,Java 8,Java Stream,我感觉不到Java8流中的map()和mapToObj()方法之间的区别。在这两种方法中,我们都可以创建对象并将其返回到流,所以为什么这些方法是两个而不是一个 你能举例说明吗?你会看到这个很酷的图案。Stream类包括IntStream、LongStream、DoubleStream等。这样,您就可以在流操作中使用基元类型。因为否则,您必须使用流或流,这会将值框起来 类似地,map方法也可以这样做。在Stream类中,有mapToInt,mapToDouble方法,但在IntStream,Dou
map()
和mapToObj()
方法之间的区别。在这两种方法中,我们都可以创建对象并将其返回到流,所以为什么这些方法是两个而不是一个
你能举例说明吗?你会看到这个很酷的图案。
Stream
类包括IntStream
、LongStream
、DoubleStream
等。这样,您就可以在流操作中使用基元类型。因为否则,您必须使用流
或流
,这会将值框起来
类似地,map
方法也可以这样做。在Stream
类中,有mapToInt
,mapToDouble
方法,但在IntStream
,DoubleStream
类中情况略有不同
在
IntStream
中,map
方法采用IntUnaryOperator
,将int映射到int。如果要将流映射到流
,必须使用mapToObj
mapToObj
是个好名字,因为它与映射到int的map
不同。它表示流从IntStream
变为stream
。mapToObj
被命名为这样的原因与mapToInt
被命名为这样的原因是一样的——表示流
类型数据类型的原语和对象版本(即int
和整数
,double
和double
等)发生了变化在Java中彼此并不真正兼容。通过额外的自动装箱/拆箱步骤使它们兼容。因此,如果您有一个基本INT流,并且如果您尝试使用流
和函数
(即流
和函数
)的对象版本,您将承担装箱和拆箱元素的成本
为了消除这个问题,函数包包含流的原始专用版本以及函数接口。例如,您应该使用IntStream
,而不是使用Stream
。现在可以使用IntFunction
处理流的每个元素。这将完全避免自动装箱/取消装箱
因此,每当您想要处理原语元素流时,都应该使用原语专用流(即IntStream
、LongStream
、和DoubleStream
)和原语专用功能接口(即IntFunction
、IntConsumer
、IntSupplier
)等)以实现更好的性能
还有一点需要注意的是,基本的专用功能接口(如IntFunction
,DoubleFunction
,或IntConsumer
)都没有扩展非基本功能接口(即函数
,消费者
,等等)
java.util.function包
包含所有功能接口的int
、double
和long
(但没有float
)版本。例如,有IntFunction
、double函数和LongFunction
,它们是int
、double
和long
函数的版本。这些函数与流的原始专用版本一起使用,如IntStream
、DoubleStream
和LongStream
让我们举几个例子:
Stream<Object> stream1 = Stream.of(1, 2, 3); //Will compile fine
IntStream intStream1 = IntStream.of(4, 5, 6); //Will compile fine
Stream<Object> stream2 = IntStream.of(4, 5, 6); //Does not compile
Stream<Object> stream3 = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed
IntStream intStream2 = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed
streamstream1=Stream.of(1,2,3)//我会很好的
IntStream intStream1=IntStream.of(4,5,6)//我会很好的
Stream stream2=IntStream.of(4,5,6)//不编译
Stream stream3=IntStream.of(4,5,6).mapToObj(e->e)//需要mapToObj方法
IntStream intStream2=Stream.of(4,5,6).mapToInt(e->e)//需要mapToInt方法
总之,您可能使用
mapToObj
的原因与您可能使用mapToInt
的原因相同,这是为了更改流
类型。它们只存在于原始流上,其中map
用于将原始类型映射到自身,例如IntStream.map(IntOperator)
。您可以添加对boxed()
方法的提及,该方法在egIntStream
和Stream
之间传输,并适合此模式。