压缩Java集合
本文我们探讨如何压缩两个集合至一个逻辑集合。压缩操作与连接或合并稍微有些不同,后者是简单在原集合后面增加新的集合,压缩操作从每个集合中取一个元素然后合并它们。默认Java库没有提供压缩功能,但一些第三方库提供了类似功能。
假如有两个列表,一个名称集合,另一个是年龄集合。
List<String> names = new ArrayList<>(Arrays.asList("John", "Jane", "Jack", "Dennis"));
List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));
压缩之后,我们从两个列表中得到名称、年龄对结构。
1. 使用Java8 IntStream
使用Java Api,可以生成IntStream索引然后使用索引从两个集合中抽取元素:
IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
// ...
2. 使用Guava Stream
Google Guava 的Streams类提供zip工具方法,其消除了创建、映射索引的所有麻烦,并将语法简化为输入和操作:
Streams
.zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
// ...
3. 使用jOOλ (jOOL)
jOOL也为Java 8 Lambda提供了一些有趣的附加功能,利用Tuple1到Tuple16,压缩操作变得非常有意思:
Seq
.of("John","Jane", "Dennis")
.zip(Seq.of(24,25,27));
结果生成一个序列,其中包括一系列元祖:
(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
jOOL的压缩方法也提供了自定义转换功能:
Seq
.of(1, 2, 3)
.zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);
或者如果希望直接使用索引压缩,可以使用zipWithIndex 方法:
Seq.of("a", "b", "c").zipWithIndex();
4. 总结
本文介绍了Java 几种集合压缩方法实现。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/103019095