收集到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议这样看。