如何压缩两个 Java 列表

2022-09-01 01:25:43

我有2个列表:

List<String> subjectArr = Arrays.asList<String>("aa", "bb", "cc");
List<Long> numArr = Arrays.asList<Long>(2L, 6L, 4L);

如何创建新的列表并将其压缩到其中?List

List<?> subjectNumArr = zip(subjectArr, numArr);
// subjectNumArr == [{'aa',2},{'bb',6},{'cc',4}]

答案 1

下面是使用该类的 Java-8 解决方案(如@ZhekaKozlov答案所示):Pair

public static <A, B> List<Pair<A, B>> zipJava8(List<A> as, List<B> bs) {
    return IntStream.range(0, Math.min(as.size(), bs.size()))
            .mapToObj(i -> new Pair<>(as.get(i), bs.get(i)))
            .collect(Collectors.toList());
}

在 Java 9 及更高版本中,您可以使用:Map.entry()

    public static <A, B> List<Map.Entry<A, B>> zipJava8(List<A> as, List<B> bs) {
        return IntStream.range(0, Math.min(as.size(), bs.size()))
                .mapToObj(i -> Map.entry(as.get(i), bs.get(i)))
                .collect(Collectors.toList());
    }

答案 2

根据相关问题,您可以使用番石榴(> = 21.0)来执行此操作:

List<String> subjectArr = Arrays.asList("aa", "bb", "cc");
List<Long> numArr = Arrays.asList(2L, 6L, 4L);
List<Pair> pairs = Streams.zip(subjectArr.stream(), numArr.stream(), Pair::new)
        .collect(Collectors.toList());

请注意,番石榴方法被注释为 ,尽管这在实践中的含义取决于解释,但自21.0版本以来,该方法没有改变。@Beta


推荐