xen*_*ide 47 java java-8 java-stream
我正在寻找最无痛的方法来过滤集合.我在想类似的东西
Collection<?> foo = existingCollection.stream().filter( ... ). ...
Run Code Online (Sandbox Code Playgroud)
但我不确定如何最好从过滤器,返回或填充另一个集合.大多数例子似乎都像"在这里你可以打印".可能有一个我缺少的构造函数或输出方法.
Hol*_*ger 117
大多数例子都避免将结果存储到一个中,这是有原因的Collection
.这不是推荐的编程方式.你已经有了一个Collection
,提供源数据和集合的它本身没用.您希望对其执行某些操作,因此理想情况是使用流执行操作并跳过将数据存储在中间中Collection
.这是大多数例子试图建议的.
当然,有很多现有的API与Collection
s 一起使用,并且总会如此.所以Stream
API提供了不同的方法来处理a的需求Collection
.
获取List
保存结果的任意实现:
List<T> results = l.stream().filter(…).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)获取Set
保存结果的任意实现:
Set<T> results = l.stream().filter(…).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)得到具体的Collection
:
ArrayList<T> results =
l.stream().filter(…).collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)添加到现有Collection
:
l.stream().filter(…).forEach(existing::add);
Run Code Online (Sandbox Code Playgroud)创建一个数组:
String[] array=l.stream().filter(…).toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)使用该数组创建具有特定特定行为的列表(可变,固定大小):
List<String> al=Arrays.asList(l.stream().filter(…).toArray(String[]::new));
Run Code Online (Sandbox Code Playgroud)允许支持并行的流添加到临时本地列表并在以后加入它们:
List<T> results
= l.stream().filter(…).collect(ArrayList::new, List::add, List::addAll);
Run Code Online (Sandbox Code Playgroud)
(注意:这与Collectors.toList()
当前实现的方式密切相关,但这是一个实现细节,即无法保证toList()
收集器的未来实现仍将返回ArrayList
)
java.util.stream
的文档中的一个示例:
List<String>results =
stream.filter(s -> pattern.matcher(s).matches())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Collectors
有一个toCollection()
方法,我建议这样看。
归档时间: |
|
查看次数: |
52987 次 |
最近记录: |