Collectors.toList()中的差异LongStream VS流

时间:2015-08-08 11:50:37

标签: java java-8 java-stream collectors

为什么当我从LongStream获取Collectors.toList()的列表时出现错误但是Stream没有错误?

示例:

错误:

Something.mapToLong(Long::parseLong).collect(Collectors.toList())

正确:

Something.map(Long::valueOf).collect(Collectors.toList())

1 个答案:

答案 0 :(得分:7)

Stream API中有四个不同的类:StreamIntStreamLongStreamDoubleStream。后三者用于处理原始值intlongdouble以获得更好的性能。它们是针对这些原始类型而定制的,它们的方法与Stream方法有很大不同。例如,有LongStream.sum()方法,但没有Stream.sum()方法,因为您无法对任何类型的对象求和。由于收集器正在接受对象(JDK中没有特殊的原始收集器),原始流不能与收集器一起使用。

Stream类可用于处理任何对象,包括基本类型包装类,如IntegerLongDouble。由于您要收集到List<Long>,因此您不需要long基元流,而是Long个对象流。因此,您需要Stream<Long>map而不是mapToLongmapToLong可能很有用,例如,如果您需要原始long[]数组:

long[] result = Something.mapToLong(Long::valueOf).toArray();