在使用 scala 的时候常常用到 zipWithIndex 函数,方便做一些流计算时的处理工作,但是在 Java 中默认情况下没有这个函数,自己实现一下方便复用吧。
代码描述代码非常简单只需要一行代码,同样是基于流计算而添加的功能。
package cn.smileyan.demo.stream;
import javafx.util.Pair;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class CollectionUtil {
public static List> zipWithIndex(List list) {
return IntStream.range(0, list.size()).mapToObj(e -> new Pair<>(list.get(e), e)).collect(Collectors.toList());
}
public static List> zip(List list1, List list2) {
int minSize = Math.min(list1.size(), list2.size());
return IntStream.range(0, minSize).mapToObj(i -> new Pair<>(list1.get(i), list2.get(i))).collect(Collectors.toList());
}
public static void main(String[] args) {
// 创建一个 list 等待配置索引
List list = IntStream.range(20, 30).boxed().collect(Collectors.toList());
List> listWithIndex = CollectionUtil.zipWithIndex(list);
System.out.println("zipWithIndex");
listWithIndex.forEach(pair -> System.out.println(pair.getKey() +":" + pair.getValue()));
System.out.println("zip");
List list2 = IntStream.range(0, 20).boxed().collect(Collectors.toList());
List> zipResult = zip(list, list2);
zipResult.forEach(pair -> System.out.println(pair.getKey() +":" + pair.getValue()));
}
}
zipWithIndex 20:0 21:1 22:2 23:3 24:4 25:5 26:6 27:7 28:8 29:9 zip 20:0 21:1 22:2 23:3 24:4 25:5 26:6 27:7 28:8 29:9补充说明 索引与值的位置
前面的代码返回结果是两列,第一列是列表数值本身,第二列是索引,这是因为参考 scala 代码的zipWithIndex的代码而实现的,如果不习惯这种方法可以考虑把 index 放在第一列,只需要改变一下位置就可以了。
如果是更复杂的数据如果需要加入的不是一列数据而是两列数据(类似于表的形式),需要给它们一行一行的添加索引。那么可以考虑用到 org.javatuples 提供的 Tuple 数据结构,对 Tuple 抽象类有多种实现,前面源码用到的是其中的 Pair 类在这里也有实现,也就是只有两个数的时候,类似的还有
- Triplet 支持三个不同类型的数据
- Quartet 支持四个
- Quintet 支持五个
- Sextet 支持六个
- Septet 支持七个
- Octet 支持八个
- Ennead 支持九个
- Decade 支持十个
也就是说,本来是三列,那么zipIndex以后就是四列,等等。
总结org.javatuples javatuples compile
最近一直在 stream map filter collect,包括 scala 和 java 的需求。根据实际开发需要我会继续总结经验,分享给需要的小伙伴们,谢谢支持~~
Smileyan
2022.7.21 15:24



