要流式传输到新集合的集合
2022-08-31 13:56:42
我正在寻找最无痛的方式来过滤收藏。我在想这样的事情
Collection<?> foo = existingCollection.stream().filter( ... ). ...
但我不确定如何最好地从过滤器转到返回或填充另一个集合。大多数例子似乎就像“在这里你可以打印”。可能有一个构造函数,或输出方法,我错过了。
我正在寻找最无痛的方式来过滤收藏。我在想这样的事情
Collection<?> foo = existingCollection.stream().filter( ... ). ...
但我不确定如何最好地从过滤器转到返回或填充另一个集合。大多数例子似乎就像“在这里你可以打印”。可能有一个构造函数,或输出方法,我错过了。
大多数示例避免将结果存储到 .这不是推荐的编程方式。您已经有一个 ,提供源数据和集合的那个本身是没有用的。您希望对其执行某些操作,因此理想的情况是使用流执行操作,并跳过将数据存储在中间中。这是大多数例子试图暗示的。Collection
Collection
Collection
当然,有很多现有的API与s一起工作,而且总是会有的。因此,API 提供了不同的方法来处理 .Collection
Stream
Collection
获取包含所有元素的不可修改的实现 (JDK 16):List
List<T> results = l.stream().filter(…).toList();
获取保存结果的任意实现:List
List<T> results = l.stream().filter(…).collect(Collectors.toList());
获取一个不可修改的禁止列表
,如(JDK 10):null
List.of(…)
List<T> results = l.stream().filter(…).collect(Collectors.toUnmodifiableList());
获取保存结果的任意实现: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);
创建一个数组:
String[] array=l.stream().filter(…).toArray(String[]::new);
使用数组创建具有特定特定行为(可变、固定大小)的列表:
List<String> al=Arrays.asList(l.stream().filter(…).toArray(String[]::new));
允许支持并行的流添加到临时本地列表,并在之后加入它们:
List<T> results
= l.stream().filter(…).collect(ArrayList::new, List::add, List::addAll);
(注意:这与当前实现方式密切相关,但这是一个实现细节,即不能保证收集器的未来实现仍将返回Collectors.toList()
toList()
ArrayList
)
文档中的示例:java.util.stream
List<String>results =
stream.filter(s -> pattern.matcher(s).matches())
.collect(Collectors.toList());
Collectors
有一种方法,我建议这样看。toCollection()