java8-stream-flatMap
下面的代码A处的第一种, 可以正确输出结果如下;
B处的int数组类型的就会报告错误:Bad return type in lambda expression: int[] cannot be converted to int
请java8 stream高手指教下为何~
(1, 2) (1, 4) (1, 6) (1, 8) (1, 10) (3, 2) (3, 4) (3, 6) (3, 8) (3, 10) (5, 2) (5, 4) (5, 6) (5, 8) (5, 10) (7, 2) (7, 4) (7, 6) (7, 8)
public static void main(String[] args) {
// A: 第一种
List<Integer> xList = Arrays.asList(1, 3, 5, 7);
List<Integer> yList = Arrays.asList(2, 4, 6, 8, 10);
List<int[]> collect = xList.stream().
flatMap(
i -> yList.stream()
.map(j -> new int[]{i, j})
)
.collect(Collectors.toList());
collect.stream()
.forEach(a -> System.out.println("(" + a[0] + ", " + a[1] + ")"));
// B:第二种
int[] xArr = {1, 3, 5, 7};
int[] yArr = {2, 4, 6, 8, 10};
List<int[]> intsList = Arrays.stream(xArr)
.flatMap(i -> Arrays.stream(yArr)
.map(j -> new int[]{i, j})
)
.collect(Collectors.toList());
// 这块会报错: Bad return type in lambda expression: int[] cannot be converted to int
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
修改方法其实之前echohw的回答已经写出来
至于为什么会报这个错,可以比对一下A中的
map(j -> new int[]{i, j})
和B中的map(j -> new int[]{i, j})
看起来都是调用的
map
方法,但是实际上这是两个不同Stream
的map
的方法A是
Stream
的map
方法B是
IntStream
的map
方法并且
Stream
的map
方法入参是一个Function
也就是提供一个引用类型参数返回另一个引用类型结果,这是引用类型的
@FunctionalInterface
而
IntStream
的map
方法入参是一个IntUnaryOperator
它要求提供一个
int
参数,返回另一个int
结果,相当于这是基本类型的@FunctionalInterface
ok,了解以上,我们再回过头看A和B的处理过程就明白为啥A不报错,而B要报错了
A的
yList.stream().map(j -> new int[]{i, j})
中stream()
方法后,流里的元素是Integer
,是引用类型map
方法入参需要一个Function
lambda
表达式:j -> new int[]{i, j}
,即Integer
—>int[]
(数组也是引用类型哈),那这种形式满足Function
所以不报错B中的
Arrays.stream(yArr).map(j -> new int[]{i, j})
stream()
方法后,流里的元素是int
,是基本类型map
方法入参需要一个IntUnaryOperator
lambda
表达式:j -> new int[]{i, j}
,即int
—>int[]
,但是IntUnaryOperator
返回需要一个int
结果,因此编译器需要帮你做一个强转,但是恰好,int[]
又不能强转成int
,所以会报错综上,因为你最终想要
List<int[]>
,所以A和B中stream
的起点元素不同,那后续使用的方式就不同,因此才有echohw中写的,再做一次装箱操作boxed()
把基本类型转换成引用类型将IntStream转为Stream<Integer>就好了