为什么我不能将整数映射到string从数组中stream式传输?

此代码工作(采取在Javadoc):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); 

这个不能编译:

 int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); 

IDEA告诉我,我有一个“在lambdaexpression式中不兼容的返回typesstring”。

为什么? 以及如何解决这个问题?

Arrays.stream(int[])创build一个IntStream ,而不是一个Stream<Integer> 。 因此,当将int映射到对象时,您需要调用mapToObj而不是仅map

这应该按预期工作:

 String commaSeparatedNumbers = Arrays.stream(numbers) .mapToObj(i -> ((Integer) i).toString()) //i is an int, not an Integer .collect(Collectors.joining(", ")); 

你也可以这样写:

 String commaSeparatedNumbers = Arrays.stream(numbers) .mapToObj(Integer::toString) .collect(Collectors.joining(", ")); 

Arrays.stream(numbers)IntStream创build一个IntStream的映射操作需要一个IntUnaryOperator (即一个函数int -> int )。 你想要应用的映射函数并不尊重这个契约,因此也是编译错误。

你需要先调用boxed()才能得到Stream<Integer> (这是Arrays.asList(...).stream()返回的内容)。 然后像在第一个片段中那样调用map

请注意,如果您需要boxed()后跟map ,则可能需要直接使用mapToObj

优点是mapToObj不需要将每个int值包装到Integer对象; 取决于你应用的映射function当然; 所以我会select这个也写的更短的选项。

你可以使用Arrays.stream(int [])创build一个整数stream,你可以像mapToObj(Integer::toString)那样调用mapToObj

 String csn = Arrays.stream(numbers) // your numbers array .mapToObj(Integer::toString) .collect(Collectors.joining(", ")); 

希望这可以帮助..

如果这个示例和问题的目的是要弄清楚如何将string映射到一个整数(例如,使用整数来访问一个string数组中的索引),您还可以使用装箱,然后转换为一个int(这将允许访问数组的索引)。

 int[] numbers = {0, 1, 2, 3}; String commaSeparatedNumbers = Arrays.stream(numbers) .boxed() .map((Integer i) -> Integer.toString((int)i)) .collect(Collectors.joining(", ")); 

.boxed()调用将您的IntStream(一个原始数据stream)转换为一个Stream(一个对象stream – 即Integer对象),然后它将接受一个对象的返回(在这个例子中是一个String对象)你的lambda。 这里只是一个用于演示目的的数字的string表示,但它可以像任何string对象一样容易(也更实际) – 就像之前提到的string数组的元素一样。

只是想我会提供另一种可能性。 在编程中,总是有多种方式来完成任务。 尽可能多地了解,然后select一个适合当前任务的最好的方法,记住性能问题,直观性,代码的清晰度,编码风格的偏好以及最自我logging。

快乐的编码!

没有拳击,AFAIK,没有爆炸的小string添加到堆中:

 public static void main(String[] args) { IntStream stream = IntStream.of(1, 2, 3, 4, 5, 6); String s = stream.collect(StringBuilder::new, (builder, n) -> builder.append(',').append(n), (x, y) -> x.append(',').append(y)).substring(1); System.out.println(s); }