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

lambda – 使用Java 8流迭代两个列表

发布时间:2020-12-15 04:45:55 所属栏目:Java 来源:网络整理
导读:如何在 Java 8流中编写以下内容? int total = 0; for (ObjectA obja : rootObj.getListA()) { for (ObjectB objb : obja.getListB()) { total += objb.getCount() * obja.getCount(); } }return total; 解决方法 用于将嵌套for循环转换为Stream API用法的规
如何在 Java 8流中编写以下内容?

int total = 0;
  for (ObjectA obja : rootObj.getListA()) {
    for (ObjectB objb : obja.getListB()) {
        total += objb.getCount() * obja.getCount();
    }
   }

return total;

解决方法

用于将嵌套for循环转换为Stream API用法的规范解决方案是通过flatMap:

return rootObj.getListA().stream()
.flatMapToInt(objA->objA.getListB().stream()
                                   .mapToInt(objB->objB.getCount() * objA.getCount()))
.sum();

这允许您为每个内部迭代执行操作.但是,在求和的特殊情况下,您可以简化操作,因为无论您计算(a b c d)还是(a b)(c d)都无关紧要:

return rootObj.getListA().stream()
.mapToInt(objA->objA.getListB().stream()
                               .mapToInt(objB->objB.getCount() * objA.getCount()).sum())
.sum();

当我们记住基本算术时,我们也应该记得(a * x)(b * x)等于(ab)* x,换句话说,没有必要将ListB的每个项目与objA因为我们也可以将该计数的结果加倍:

return rootObj.getListA().stream()
.mapToInt(objA->objA.getListB().stream().mapToInt(ObjectB::getCount).sum()*objA.getCount())
.sum();

(编辑:李大同)

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

    推荐文章
      热点阅读