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

新手上路,请多包涵

此代码有效(取自 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 表达式中有一个不兼容的返回类型字符串”。

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

原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 580
2 个回答

Arrays.stream(int[]) 创建一个 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(", "));

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

Arrays.stream(numbers) creates an IntStream under the hood and the map operation on an IntStream requires an IntUnaryOperator (ie a function int -> int )。您要应用的映射函数不遵守此合同,因此会出现编译错误。

您需要先致电 boxed() 才能获得 Stream<Integer> (这就是 Arrays.asList(...).stream() 返回)。然后像在第一个片段中那样调用 map

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

优点是 mapToObj 不需要将每个 int 值装箱到 Integer 对象;当然取决于您应用的映射功能;所以我会选择这个写起来也更短的选项。

原文由 Alexis C. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题