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)
Ale*_* C. 19
Arrays.stream(numbers)创建一个IntStream引擎盖和地图操作IntStream需要一个IntUnaryOperator(即一个功能int -> int).您要应用的映射函数不遵守此合同,因此不符合编译错误.
您需要先调用boxed()才能获得Stream<Integer>(这是Arrays.asList(...).stream()返回的).然后就像map在第一个片段中那样打电话.
请注意,如果您需要boxed(),map您可能想mapToObj直接使用.
优点是mapToObj不需要将每个int值包装到一个Integer对象; 取决于你当然适用的映射功能; 所以我会选择这个也更短的选项.
您可以使用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)
希望这可以帮助..
| 归档时间: |
|
| 查看次数: |
38080 次 |
| 最近记录: |