为什么我不能将整数映射到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); }