Collector的Javadoc演示了如何将流中的元素收集到一个新的List中。是否有一行程序将结果添加到现有的数组列表中?


当前回答

假设我们有一个现有的列表,并将使用java 8来进行这个活动 `

import java.util.*;
import java.util.stream.Collectors;

public class AddingArray {

    public void addArrayInList(){
        List<Integer> list = Arrays.asList(3, 7, 9);

   // And we have an array of Integer type 

        int nums[] = {4, 6, 7};

   //Now lets add them all in list
   // converting array to a list through stream and adding that list to previous list
        list.addAll(Arrays.stream(nums).map(num -> 
                                       num).boxed().collect(Collectors.toList()));
     }
}

`

其他回答

targetList = sourceList.stream().flatmap(List::stream).collect(Collectors.toList());

Erik Kaplun已经给出了很好的理由,为什么您不希望将流的元素收集到现有的List中。

无论如何,如果您确实需要这个功能,您可以使用下面的一行程序。

但正如在其他答案中指出的那样,你永远不应该这样做,特别是如果流可能是并行流——使用风险自负……

list.stream().collect(Collectors.toCollection(() -> myExistingList));

据我所知,到目前为止,所有其他答案都使用收集器向现有流添加元素。然而,有一个更短的解决方案,它既适用于顺序流,也适用于并行流。您可以简单地将forEachOrdered方法与方法引用结合使用。

List<String> source = ...;
List<Integer> target = ...;

source.stream()
      .map(String::length)
      .forEachOrdered(target::add);

唯一的限制是,源和目标是不同的列表,因为只要流正在处理,您就不允许对流的源进行更改。

注意,此解决方案同时适用于顺序流和并行流。但是,它并不能从并发性中获益。传递给forEachOrdered的方法引用将始终按顺序执行。

您只需要将您的原始列表引用为collections . tolist()返回的列表。

下面是一个演示:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Reference {

  public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    System.out.println(list);

    // Just collect even numbers and start referring the new list as the original one.
    list = list.stream()
               .filter(n -> n % 2 == 0)
               .collect(Collectors.toList());
    System.out.println(list);
  }
}

下面是如何在一行中将新创建的元素添加到原始列表。

List<Integer> list = ...;
// add even numbers from the list to the list again.
list.addAll(list.stream()
                .filter(n -> n % 2 == 0)
                .collect(Collectors.toList())
);

这就是函数式编程范型所提供的。

我将连接旧列表和新列表作为流,并将结果保存到目标列表。并行也能很好地工作。

我将使用Stuart Marks给出的一个公认答案的例子:

List<String> destList = Arrays.asList("foo");
List<String> newList = Arrays.asList("0", "1", "2", "3", "4", "5");

destList = Stream.concat(destList.stream(), newList.stream()).parallel()
            .collect(Collectors.toList());
System.out.println(destList);

//output: [foo, 0, 1, 2, 3, 4, 5]

希望能有所帮助。