任何人都可以向我解释以下原因为何不起作用:

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) ,该方法产生LongStreamLongStream 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/

10-10 02:05