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]
希望能有所帮助。