乐趣区

关于java:Java中压缩集合你都知道哪几种方式

本文出自《愚公要移山》

收录在《java 实用技巧》专栏

前言

这个问题算是开发当中偶然会遇到的一个小问题,比方如何将两个汇合压缩成为一个逻辑汇合。

如果你不了解,咱们能够看一个简略的例子,去阐明什么是压缩汇合。本文文章不长,然而还算是比拟实用的小技巧。次要内容来源于国外小哥 Baeldung 的博客:上面给出个地址

https://www.baeldung.com/java…

这位大佬尽管写的很具体,然而有一些细节小问题,我在此基础之上,实地验证了一遍,发现有几个坑,不过曾经填完了。

案例解释什么是压缩汇合

当初有两个汇合:names 和 ages

`List<String> names = new ArrayList<>(Arrays.asList(“ 张三 ”, “ 李四 ”, “ 王五 ”));
List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));
`

压缩完之后咱们遍历压缩对象变成了上面这种模式:

` 张三:24
李四:25
王五:27
`

也就是 name:age 的键值对的模式,当然,如果咱们的汇合比拟多,咱们还能够压缩更多的汇合。比方一个人的各种信息,id:name:age 等等。

OK,晓得了什么是压缩,上面不回简明扼要,间接给出压缩的几种模式,

压缩汇合的几种形式

形式一:Java 8 的 IntStream

`List<String> names = new ArrayList<>(Arrays.asList(“ 张三 ”, “ 李四 ”, “ 王五 ”));
List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));
// 形式一:java8 的 IntSream
Stream<String> stream = IntStream
      .range(0, Math.min(names.size(), ages.size()))
      .mapToObj(i -> names.get(i) + “:” + ages.get(i));
// 遍历输入
stream.forEach(System.out::println);
`

这种形式比较简单,获取两个汇合的流,而后转化为对象。java8 能够间接应用。

形式二:Guava Streams

`List<String> names = new ArrayList<>(Arrays.asList(“ 张三 ”, “ 李四 ”, “ 王五 ”));
List<Integer> ages = new ArrayList<>(Arrays.asList(24, 25, 27));
// 形式二:guava
// 第一种
Streams.forEachPair(
       Stream.of(“ 张三 ”, “ 李四 ”, “ 王五 ”),
       Stream.of(1, 2,3),
       (name, age) -> System.out.println(name + “:” + age));
// 第二种:
Stream<String> stream2 = Streams.zip(names.stream(), ages.stream(), 
        (name, age) -> name + “:” + age);
stream2.forEach(System.out::println);
// 第三种:
Stream<String> stream3 = Streams.mapWithIndex(
        Stream.of(“a”, “b”, “c”),
        (str, index) -> str + “:” + index);
stream3.forEach(System.out::println);
`

以上是几种实现的形式,这位大佬给出了一种,我又去官网找了其余几种。另外应用 guava 的时候,版本要求 21 以上。咱们在 pom 文件增加以下依赖即可:

`<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1-jre</version>
 </dependency>
`

这里留神应用最新版的就能够。其余的兴许会报错。我试了版本 21 的,也出错。

形式二:Using jOOλ _(jOOL)_

jOOL 还在 Java 8 Lambda 上提供了一些乏味的新性能,并且通过对 Tuple1 到 Tuple16 的反对,zip 操作变得更加乏味:

`// 形式三:jool
// 第一种
Seq<Tuple2<String,Integer>> s1 = Seq.of(“ 张三 ”,” 李四 ”, “ 王五 ”)
    .zip(Seq.of(24,25,27));
// 第二种
Seq<String> s2 = Seq.of(1, 2, 3)
    .zip(Seq.of(“a”, “b”, “c”), (x, y) -> x + “:” + y);
// 第三种
Seq<Tuple2<String,Long>> s3 = Seq.of(“a”, “b”, “c”).zipWithIndex();
s1.forEach(System.out::println);
s2.forEach(System.out::println);
s3.forEach(System.out::println);
`

Seq 后果是一个压缩元组,咱们能够看看。

`(tuple(1, “a”), tuple(2, “b”), tuple(3, “c”))
`

这种形式也是须要增加依赖的。在 pom 文件增加如下依赖即可:

`<dependency>
     <groupId>org.jooq</groupId>
     <artifactId>jool-java-8</artifactId>
     <version>0.9.14</version>
</dependency>
`

ok,还有很多,根本思维都是切成流,再合并。这个间接用 java 实现也能够。

论断

“zip”操作与规范的“concat”或“merge”稍有不同。“concat”或“merge”操作将简略地在现有汇合的开端增加新汇合,而“zip”操作将从每个汇合中获取一个元素并将它们组合起来。

退出移动版