为了账号安全,请及时绑定邮箱和手机立即绑定

流式传输到新集合的集合

流式传输到新集合的集合

杨魅力 2019-09-02 16:19:39
我正在寻找最无痛的方法来过滤集合。我在想类似的东西Collection<?> foo = existingCollection.stream().filter( ... ). ...但我不确定如何最好从过滤器,返回或填充另一个集合。大多数例子似乎都像“在这里你可以打印”。可能有一个我缺少的构造函数或输出方法。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

大多数例子都避免将结果存储到一个中,这是有原因的Collection。这不是推荐的编程方式。你已经有了一个Collection,提供源数据和集合的它本身没用。您希望对其执行某些操作,因此理想情况是使用流执行操作并跳过将数据存储在中间中Collection。这是大多数例子试图建议的。


当然,有很多现有的API与Collections 一起使用,并且总会如此。所以StreamAPI提供了不同的方法来处理a的需求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);

创建一个数组:


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)


查看完整回答
反对 回复 2019-09-02
?
炎炎设计

TA贡献1808条经验 获得超4个赞

来自java.util.stream文档的一个例子:


List<String>results =

     stream.filter(s -> pattern.matcher(s).matches())

           .collect(Collectors.toList());

Collectors有一种toCollection()方法,我建议这样看。


查看完整回答
反对 回复 2019-09-02
?
墨色风雨

TA贡献1853条经验 获得超6个赞

作为一个更符合Java 8风格的函数式编程的例子:


Collection<String> a = Collections.emptyList();

List<String> result = a.stream().

     filter(s -> s.length() > 0).

     collect(Collectors.toList());


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 619 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信