Skip to main content
 首页 » 编程设计

压缩Java集合

2022年07月19日138lyj

压缩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
阅读延展