本文出自《愚公要移山》
收录在《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”操作将从每个汇合中获取一个元素并将它们组合起来。