【问题标题】:Can I replace this For loop using a ForEach我可以用 ForEach 替换这个 For 循环吗
【发布时间】:2020-11-24 17:06:27
【问题描述】:

以下代码运行良好,但出于好奇,我想知道是否可以用 ForEach 替换 For 循环

private static List<SubjectRole> getSubjectRoles(List<ca.payment.simulator.model.api.SubjectRole> subjectRoles) {
    List<SubjectRole> subjectRoleList = new ArrayList<>();

    for (ca.payment.simulator.model.api.SubjectRole subjectRole : subjectRoles) {
        SubjectRole subjectRoleStream = new SubjectRole();
        subjectRoleStream.setSubjectRole(subjectRole.getSubjectRole());
        subjectRoleList.add(subjectRoleStream);
    }

    return subjectRoleList;
}

【问题讨论】:

  • 你的意思是流 API 吗?
  • 更改为 foreach 没有多大意义。您应该使用流、映射和收集来充分利用流 API
  • 差不多。我看我来晚了。
  • 当您想知道某件事是否可行时,是什么阻止您尝试它?
  • 我很困惑,你为什么要创建一个新的SubjectRole,然后用迭代的值做setSubjectRole (???)?您只是想制作一个副本列表吗?

标签: java for-loop foreach code-cleanup


【解决方案1】:

您可以,但不太可能使代码更具可读性。与Stream.forEach():

        List<SubjectRole> subjectRoleList = new ArrayList<>();

        subjectRoles.stream()
            .forEach(t -> {
                    SubjectRole subjectRoleStream = new SubjectRole();
                    subjectRoleStream.setSubjectRole(t.getSubjectRole());
                    subjectRoleList.add(subjectRoleStream);
                });
        }

        return subjectRoleList;

您可以使用 .map()/.collect() 让 Streams API 管理 List 分配:

        List<SubjectRole> subjectRoleList =
            subjectRoles.stream()
            .map(t -> {
                    SubjectRole subjectRoleStream = new SubjectRole();
                    subjectRoleStream.setSubjectRole(t.getSubjectRole());
                    return subjectRoleStream;
                })
            .collect(Collectors.toList());

        return subjectRoleList;

为了更简洁,您需要以某种方式将实例化和属性集组合为一个调用(方法或构造函数)。如果没有现有方法,您可以创建一个私有帮助器:

    private static List<SubjectRole> getSubjectRoles(List<ca.payment.simulator.model.api.SubjectRole> subjectRoles) {
        List<SubjectRole> subjectRoleList =
            subjectRoles.stream()
            .map(t -> copy(t))
            .collect(Collectors.toList());

        return subjectRoleList;
    }

    private static SubjectRole copy(SubjectRole in) {
        SubjectRole out = new SubjectRole();

        out.setSubjectRole(in.getSubjectRole());

        return out;
    }

【讨论】:

  • 你说得对,它看起来并没有那么干净。谢谢大家的建议。
猜你喜欢
  • 2020-11-15
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2018-08-20
  • 2014-01-12
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多