如何在 java 中使用可变参数加入多个列表?

how do I join multiple list with varargs in java?

我想使用 Stream API 加入多个列表。

我在 Whosebug 找到了一个有用的例子:

List<Integer>list1=Arrays.asList(1,2,3);
List<Integer>list2=Arrays.asList(4,5,6);
List<Integer>list3=Arrays.asList(7,8,9);
List<Integer>list4=Arrays.asList(10,0,-1);

List<Integer> newList = 
    Stream.of(list1, list2, list3,list4)
          .flatMap(Collection::stream)
          .collect(Collectors.toList());       
System.out.println(newList); // prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, -1] 

不错。但就我而言,我无法确定要使用多少列表 Stream.of().

我考虑过在 jdk8 中使用可变参数。像这样

public List<Integer> getNewList(List... list) {
    List<Integer> newList = 
         Stream.of(list)
               .flatMap(Collection::stream)
               .collect(Collectors.toList());
    return newList;
}

getNewList(list1, list2, list3, list...) 

不幸的是,它并没有很好地工作。有什么办法可以做到这一点吗?

您应该指定要作为 var args 传递的 List 参数的类型,您也可以使用 Arrays.stream 而不是 Stream.of

 public static List<Integer> getNewList(List<Integer>... list){
    return Arrays.stream(list)
            .flatMap(List::stream)
            .collect(Collectors.toList());
}

像这样尝试。使用 Arrays.stream() 通过可变参数语法流式传输列表数组。

public static <T> List<T> getNewList(List<T>... list) {
    return  Arrays.stream(list).flatMap(Collection::stream)
                    .collect(Collectors.toList());
}

Arrays.stream 应该可以解决问题:

public static <T> List<T> merge(List<T>... lists) {
    return Arrays.stream(lists)
                 .flatMap(List::stream)
                 .collect(Collectors.toList());

}

顺便说一句,我刚刚注意到您的解决方案几乎没问题。您唯一需要添加的是 <Integer>。所以Stream.of应该也可以。

public List<Integer> getNewList(List<Integer>... list) {
    List<Integer> newList = 
         Stream.of(list)
               .flatMap(Collection::stream)
               .collect(Collectors.toList());
    return newList;
}

事实上,Stream::of 在后台调用 Arrays::stream。因此,您可以将它们中的任何一个用于您的特定用例。