收集到stream到一个新的集合
我正在寻找最无痛的方式来过滤一个集合。 我在想这样的事情
Collection<?> foo = existingCollection.stream().filter( ... ). ...
但我不确定从filter到返回或填充另一个集合的最佳方式。 大多数例子似乎是“在这里你可以打印”。 可能有一个构造函数,或输出方法,我错过了。
大多数例子避免将结果存储到Collection
是有原因的。 这不是推荐的编程方式。 你已经有了一个Collection
,提供源数据和集合的这个Collection
本身是没有用的。 您希望对其执行某些操作,因此理想的情况是使用stream执行操作并跳过将数据存储在中间Collection
。 这是大多数例子试图build议的。
当然,有很多现有的API与Collection
一起工作,并且总会有。 所以Stream
API提供了不同的方式来处理一个Collection
的需求。
-
获取一个包含结果的任意
List
实现:List<T> results = l.stream().filter(…).collect(Collectors.toList());
-
获取一个包含结果的任意
Set
实现:Set<T> results = l.stream().filter(…).collect(Collectors.toSet());
-
获取特定的
Collection
:ArrayList<T> results = l.stream().filter(…).collect(Collectors.toCollection(ArrayList::new));
-
添加到现有的
Collection
:l.stream().filter(…).forEach(existing::add);
-
创build一个数组:
String[] array=l.stream().filter(…).toArray(String[]::new);
-
使用该数组创build一个具有特定特定行为(可变,固定大小)的列表:
List<String> al=Arrays.asList(l.stream().filter(…).toArray(String[]::new));
-
允许支持并行的stream添加到临时本地列表,然后join:
List<T> results = l.stream().filter(…).collect(ArrayList::new, List::add, List::addAll);
(注意:这与当前如何实现
Collectors.toList()
是密切相关的,但这是一个实现细节,即没有保证toList()
收集器的未来实现仍然会返回ArrayList
)
作为一个更符合Java 8风格的函数式编程的例子:
Collection<String> a = Collections.emptyList(); List<String> result = a.stream(). filter(s -> s.length() > 0). collect(Collectors.toList());
来自java.util.stream
文档的一个例子:
List<String>results = stream.filter(s -> pattern.matcher(s).matches()) .collect(Collectors.toList());
Collectors
有一个toCollection()
方法,我build议这样看。