java8 stream,遍历二维数组使用索引,往二维数组添加一列

【java】java8stream,遍历二维数组使用索引,往二维数组添加一列_IT猫咪酱的博客-CSDN博客_二维数组添加一列

使用java8中stream,遍历二维数组的情况,使用下标,并且往每行添加数据

Object[][] newData = IntStream.rangeClosed(1, data.length).mapToObj(i -> {//rangclosed 闭区间,[1,数组长度]
List list = new ArrayList(Arrays.asList(data[i - 1]));//下标:数组长度-1
list.add(index, i);
return list.toArray();
}).toArray(Object[][]::new);

 

知识点:

1.intStream进行遍历,用来当下标

使用IntStream流来构造一个Int类型的流出来,然后遍历这个Int的流,list中的对象可以通过get方法来取。具体解决代码如下:

IntStream.range(0, lists.size())
.mapToObj(i -> handle(lists.get(i), i))
.collect(Collectors.toList());

可以看到代码里的这一句:handle(lists.get(i), i),这样就成功的把索引带入到了handle方法中。

需要注意的是:在流中必须使用mapToObj,而不能使用map映射

2. map映射和mapToObj的区别

首先Stream流下面的类包含了IntStream, LongStream, DoubleStream等

那么究竟下面两者有什么区别呢?
Stream<Integer> // 包装类型
IntStream //基本类型

所以对于mapToObj和mapToInt也是同样的
mapToObj 方法主要是将Stream中的元素进行装箱操作, 转换成一个引用类型的值。
mapToInt 方法是将Stream中的 元素转换成基本类型int。
比如下面的例子

Stream s = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed
IntStream is = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed

可以看到Stream是包装类型,所以想要把IntStream基本类型流转化成包装类型,就需要使用mapToObj。

上面两个mapToObj和mapToInt是进行类型的转化,那么map的作用呢?
map不进行类型转化,如果原来流中是基本类型,map映射完应当还是基本类型,如果原来是包装类型,映射完应当还是包装类型。
比如下面这个例子:
IntStream.of(1, 2, 3, 4, 5, 6, 7).map(elem -> elem * 10).forEach(System.out::println);

这也就解释了,为什么上面的第二节解决办法里面,用map不行,而需要mapToObj,因为那里做了一个基本类型到包装类型的转化

3. 总结

使用IntStream可以灵活的操作对象和获取索引。
map不进行包装和基本类型的转化,mapToObj是基本转为包装,mapToInt是包装转为基本。

posted @ 2022-06-21 21:12  WPMA  阅读(1791)  评论(0编辑  收藏  举报