Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
map和mapToObj之间的Java流差异_Java_Java 8_Java Stream - Fatal编程技术网

map和mapToObj之间的Java流差异

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

我感觉不到Java8流中的
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()
方法的提及,该方法在eg
IntStream
Stream
之间传输,并适合此模式。