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

Den*_*ret 84 java functional-programming java-8 java-stream

此代码有效(在Javadoc中使用):

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

这个不能编译:

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

IDEA告诉我,我在lambda表达式中有一个"不兼容的返回类型字符串".

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

ass*_*ias 107

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

这应该按预期工作:

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

你也可以写:

String commaSeparatedNumbers = Arrays.stream(numbers)
    .mapToObj(Integer::toString)
    .collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

  • @FlorianMargaine"IntStream"是原始`int`值的流特化.`Stream <Integer>`只是一个包含`Integer`对象的Stream. (7认同)
  • `IntStream.mapToObj`需要一个`IntFunction`,一个消耗`int`值的函数,因此`.mapToObj((Integer i) - > i.toString())`不起作用.无论如何它都不会被推荐,因为它包含从`int`到`Integer`的不必要的转换.相比之下,`.mapToObj(Integer :: toString)`可以很好地工作,因为它将调用`static`方法`Integer.toString(int)`.请注意,这与在`Stream <Integer>`上调用`.map(Integer :: toString)`不同,后者将无法编译,因为它不明确. (7认同)
  • `IntStream`和`Stream <Integer>`有什么区别? (3认同)
  • @FlorianMargaine`InterStream`是一个流或基元(int),而`Steram <Integer>`是一个对象流.出于性能原因,原始流具有专门的方法. (2认同)

Ale*_* C. 19

Arrays.stream(numbers)创建一个IntStream引擎盖和地图操作IntStream需要一个IntUnaryOperator(即一个功能int -> int).您要应用的映射函数不遵守此合同,因此不符合编译错误.

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

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

优点是mapToObj不需要将每个int值包装到一个Integer对象; 取决于你当然适用的映射功能; 所以我会选择这个也更短的选项.


cod*_*bot 5

您可以使用Arrays.stream(int [])创建一个Integer Stream,可以调用mapToObjlike mapToObj(Integer::toString)

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

希望这可以帮助..