加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从并行流中收集结果

发布时间:2020-12-15 04:46:09 所属栏目:Java 来源:网络整理
导读:我有一段这样的代码: ListEgg eggs = hens.parallelStream().map(hen - { ArrayListEgg eggs = new ArrayList(); while (hen.hasEgg()) { eggs.add(hen.getEgg()); } return eggs;}).flatMap(Collection::stream).collect(Collectors.toList()); 但是通过这
我有一段这样的代码:

List<Egg> eggs = hens.parallelStream().map(hen -> {
    ArrayList<Egg> eggs = new ArrayList<>();
    while (hen.hasEgg()) {
        eggs.add(hen.getEgg());
    }
    return eggs;
}).flatMap(Collection::stream).collect(Collectors.toList());

但是通过这种方式,我必须为每只母鸡创建一个ArrayList,并且在母鸡100%处理之前不会收集鸡蛋.我想要这样的东西:

List<Egg> eggs = hens.parallelStream().map(hen -> {
    while (hen.hasEgg()) {
        yield return hen.getEgg();
    }
}).collect(Collectors.toList());

但Java没有收益率.有没有办法实现它?

解决方法

您的Hen类很难适应Stream API.如果您无法更改它并且没有其他有用的方法(例如Collection< Egg> getAllEggs()或Iterator< Egg> eggIterator()),您可以创建如下的egg流:

public static Stream<Egg> eggs(Hen hen) {
    Iterator<Egg> it = new Iterator<Egg>() {
        @Override
        public boolean hasNext() {
            return hen.hasEgg();
        }

        @Override
        public Egg next() {
            return hen.getEgg();
        }
    };
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it,0),false);
}

现在您可以通过以下方式使用它:

List<Egg> eggs = hens.parallelStream()
                     .flatMap(hen -> eggs(hen))
                     .collect(Collectors.toList());

当然,如果您可以更改Hen类,则可以实现更好的Stream实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读