Anu*_*ain 6 java java-8 java-stream
使用以下代码,我得到以下编译错误。我还尝试使用输入作为Integer列表而不是int [],并且它可以正常工作。如果我使用boxed(),它也可以正常工作。
我的问题确实是,如果Int Stream以及不是处理错误消息“ lambda表达式int []中的错误返回类型无法转换为int”,它必须是Integer流吗?
public static void main(String[] args) {
int[] numbers = {1,2,3,4};
List<int[]> result1 = Arrays.stream(numbers).flatMap(chara -> Arrays.stream(numbers)
.map(operand -> new int[]{1, 2})).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
错误:(13,49)Java:不兼容的类型:Lambda表达式int []中的错误返回类型无法转换为int错误:(13,66)Java:接口java.util.stream.IntStream中的方法collection无法应用于给定类型;必需:java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer找到:java.util.stream.Collector>原因:无法推断类型变量R(实际和形式)参数列表的长度不同)
我还尝试使用输入作为整数列表,而不是
int[]它可以正常工作。如果我使用boxed()也可以正常工作
因此,这实际上意味着您已经尝试过:
List<int[]> result1 = numbers.stream()
.flatMap(chara -> numbers.stream()
.map(operand -> new int[]{1, 2}))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
给定的数字是List<Integer>。
和:
List<int[]> result1 = Arrays.stream(numbers)
.boxed()
.flatMap(chara -> Arrays.stream(numbers).boxed()
.map(operand -> new int[]{1, 2}))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
给定的数字是int[]。
是的,它确实可以编译,但是根本不可读,并且肯定有更好的方法来生成相同的结果(在后面的文章中显示)。
至于编译错误,那是因为Arrays.stream(numbers)生成了,IntStream而您正在尝试map使用引用类型(int[])而不是int函数IntStream#map期望的基本类型。即使您要通过这样做来解决该问题,Arrays.stream(numbers).boxed()..也仍然会遇到另一个问题。
您的代码几乎是这样做的:
Stream.generate(() -> new int[]{1, 2})
.limit(numbers.length * numbers.length)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
要么:
IntStream.rangeClosed(1, numbers.length * numbers.length)
.mapToObj(n -> new int[]{1, 2})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但以一种更加惯用,可读和有效的方式。
| 归档时间: |
|
| 查看次数: |
1643 次 |
| 最近记录: |