为什么从数组流式传输时无法将整数映射到字符串?

这段代码有效(在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告诉我我有一个“lambda表达式中不兼容的返回类型字符串”。

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


答案 1

Arrays.stream(int[])创建 一个 ,而不是一个 .因此,在将 一个映射到对象时,您需要调用 mapToObj 而不仅仅是 。IntStreamStream<Integer>mapint

这应该按预期工作:

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(", "));

答案 2

Arrays.stream(numbers)创建一个引擎盖下,并且对一个的映射操作需要一个(即函数)。要应用的映射函数不遵循此协定,因此存在编译错误。IntStreamIntStreamIntUnaryOperatorint -> int

您需要在之前调用才能获得 a(这是返回的内容)。然后,只需像在第一个代码段中所做的那样调用即可。boxed()Stream<Integer>Arrays.asList(...).stream()map

请注意,如果需要,可能需要直接使用。boxed()mapmapToObj

优点是不需要将每个值框入对象;当然,这取决于您应用的映射功能;所以我会选择这个选项,它写起来也更短。mapToObjintInteger