1.简介
在本教程中,我们将说明如何将两个集合压缩到一个逻辑集合中。
“ zip”操作与标准“concat”或“merge”略有不同。虽然“concat”或“merge”操作只是在现有集合的末尾添加新集合,但“ zip”操作将从每个集合中获取元素并将它们组合在一起。
核心库不隐式支持“ zip”,但肯定有第三方库可以实现这种有用的操作。
考虑两个列表,一个列出人名,另一个列出他们的年龄。
List<String> names = new ArrayList<>(Arrays.asList("John", "Jane", "Jack", "Dennis"));
List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));
在压缩之后,我们最终得到了来自这两个集合中相应元素的名称 - 年龄对。
2.使用Java 8 IntStream
使用核心Java,我们可以使用IntStream生成索引,然后使用它们从两个集合中提取相应的元素:
IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
// ...
3.使用Guava Streams
Google Guava 21 在Streams类中提供了一个zip帮助方法。这消除了创建和映射索引的所有麻烦,并减少了输入和操作的语法:
Streams
.zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
// ...
4.使用jOOλ(jOOL)
jOOL还提供了一些关于Java 8 Lambda的迷人补充,并且在Tuple1到Tuple16的支持下, zip操作变得更加有趣:
Seq
.of("John","Jane", "Dennis")
.zip(Seq.of(24,25,27));
这将生成包含压缩元素元组的Seq的结果:
(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
jOOL的zip方法提供了提供自定义转换功能的灵活性:
Seq
.of(1, 2, 3)
.zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);
或者如果只想索引索引,他可以使用jOOL提供的zipWithIndex方法:
Seq.of("a", "b", "c").zipWithIndex();
image
image欢迎大家关注公众号:「Java知己」,关注公众号,回复「1024」你懂得,免费领取 30 本经典编程书籍。关注我,与 10 万程序员一起进步。 每天更新Java知识哦,期待你的到来!
网友评论