任何人都可以向我解释以下原因为何不起作用:
long la[] = new long[] {1,2,3};
Arrays.stream(la).map(Long::valueOf).collect(Collectors.toSet());
当这样做时:
String la[] = new String[] {"1","2","3"};
Arrays.stream(la).map(Long::valueOf).collect(Collectors.toSet());
前者给出了编译错误,而后者则没有。编译错误是如此神秘(Eclipse),我无法理解。
最佳答案
Arrays.stream(la)
执行方法 public static LongStream stream(long[] array)
,该方法产生LongStream
。 LongStream
的 map
方法返回LongStream
(即,源long
的每个LongStream
元素都映射到目标long
中的LongStream
元素)。 LongStream
没有接受单个参数的collect
方法,这就是collect(Collectors.toSet())
不通过编译的原因。
如果使用mapToObj
,它应该可以工作:
Set<Long> set = Arrays.stream(la).mapToObj(Long::valueOf).collect(Collectors.toSet());
您的第二个代码段有效,因为此处
Arrays.stream
生成引用类型的Stream
(Stream<String>
),其 map
方法生成另一个引用类型的Stream
(在您的情况下为Stream<Long>
)。在这里,Stream
具有一个collect
方法,该方法接受一个参数-collect(Collector<? super T, A, R> collector)
-因此collect(Collectors.toSet())
可以工作。关于java - Java 8流和简单类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36769700/