用stream还能怎么优化下面代码?

新手上路,请多包涵

问题描述

用stream还能怎么优化下面代码?

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

  List<Integer> goodsIdList = new ArrayList<>();
  refundOrderVO.getOrderItemList().forEach(refundOrderItem -> {
      orderItemList.forEach(orderItem -> {
          if (Objects.equals(refundOrderItem.getRefundOrderItemNo(),     
               orderItem.getOrderItemNo())) {
              goodsIdList.add(orderItem.getGoodsId());
          }
   });

});

你期待的结果是什么?实际看到的错误信息又是什么?

更简的写法

阅读 2.6k
4 个回答

不知道具体场景,给一个中立写法

Set<String> refundOrderItemNos refundOrderItem.stream()
    .map(item -> item.getRefundOrderItemNo())
    .collect(Collectors.toSet());

List<Integer> goodsIdList = orderItemList.stream()
    .filter(item -> refundOrderItemNos.contains(item.getOrderItemNo))
    .map(item -> orderItem.getGoodsId())
    .collect(Collectors.toList());

按照@_TNT_的写法应该是比较合适的,不过个人只是想提一点,用stream在处理集合的时候,如果你只是想着把以前的for循环改为stream里的forEach,那你还不如不用stream

你得从思想上该改变哈,一个是命令式编程,一个是声明式编程(可能更进一步说是函数式编程)

简单来说,你用声明式编程的语法却干着命令式编程的“勾当” (⊙ˍ⊙)

先在循环外面初始化一个List<Integer> goodsIdList,然后再在循环里找到需要的数据添加进去。。。这就是命令式编程石锤了,并且你使用stream看不到任何比较细力度的“函数”。。。全是一个大代码块。。就是两个大循环,你可以对比哈@_TNT_的写法,就看得出来区别了╮(╯▽╰)╭

把两层for循环 简化为一层for循环

是从一个集合里挑出被包含在另一个集合里的元素吧,感觉可以filter + anyMath试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题