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