Java干货分享

在Java中压缩集合

2019-03-05  本文已影响0人  淡定_蜗牛

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

欢迎大家关注公众号:「Java知己」,关注公众号,回复「1024」你懂得,免费领取 30 本经典编程书籍。关注我,与 10 万程序员一起进步。 每天更新Java知识哦,期待你的到来!

image
上一篇下一篇

猜你喜欢

热点阅读