如何在迭代时更新bean

How to update bean while iterating

我正在尝试更新 bean 的 属性(如果它满足条件),同时遍历它的列表。为了提高性能,我使用 Lists.transform

private void populate(final WorkFlowDataBean workFlowDataBean, final List<ApplicationDataBean> items) {
        Lists.transform(items, new Function<ApplicationDataBean, ApplicationDataBean>() {
            @Override
            public ApplicationDataBean apply(ApplicationDataBean input) {
                if (String.valueOf(workFlowDataBean.getId().intValue()).equalsIgnoreCase(String.valueOf(input.getWorkflowId().intValue()))) {
                    input.setWorkflowName(workFlowDataBean.getName());
                    input.setWorkflowVersion(workFlowDataBean.getVersion());
                    logger.info("---finally----");
                }
                logger.info(String.valueOf(workFlowDataBean.getId().intValue()) + "===" + String.valueOf(input.getWorkflowId().intValue()));
                return input;
            }
        });

    }

我不能使用 foreach 循环,因为它会减慢我的应用程序。

Lists.transform() 实际上 return 列表的延迟计算视图,这意味着您在 apply() 中拥有的所有内容仅在您开始迭代转换后的集合时才会发生。因此,您不能像现在这样使用该方法,因为如果您不使用转换后的列表,则 apply() 永远不会被调用。

为了解决这个问题,您可以尝试根据转换后的集合创建一个新列表(您也将其丢弃):

Lists.newArrayList(Lists.transform(
    /*Your transformation code*/
));

更好的长期解决方案是从整体上重新考虑该方法。也就是说,您应该在方法中简单地使用 for-each 循环,而不是将代码包装到函数中。在这种情况下,普通的命令式代码将更易于阅读并且性能也更好。

"I cannot use foreach loop as it will slow down my application" 在这里是错误的。尝试使用 Lists.transform 根本不会帮助你,因为 A) 它没有按照你认为的那样做,B) 它不是做你想做的事情的正确方法(一个 for- each loop is), C) 你必须遍历 Lists.transform 返回的 List,这不会比 for-each 循环快。您似乎认为它更快,因为您的代码 实际上没有做任何事情

如果您真的想让它更快,您可能需要研究并行化操作。

正如其他人所说,returned List 不是实际转换后的列表,而是原始 List 的视图,稍后迭代时,将应用转换每个元素。

关于错误,您必须return 转换后的列表。这就是您的代码无法正常工作的原因:

private List<ApplicationDataBean> populate(final WorkFlowDataBean workFlowDataBean, final List<ApplicationDataBean> items) {
    return Lists.transform(items, new Function<ApplicationDataBean, ApplicationDataBean>() {
        @Override
        public ApplicationDataBean apply(ApplicationDataBean input) {
            if (String.valueOf(workFlowDataBean.getId().intValue()).equalsIgnoreCase(
                String.valueOf(input.getWorkflowId().intValue()))) {
                input.setWorkflowName(workFlowDataBean.getName());
                input.setWorkflowVersion(workFlowDataBean.getVersion());
                logger.info("---finally----");
            }
            logger.info(String.valueOf(workFlowDataBean.getId().intValue()) + "==="
                + String.valueOf(input.getWorkflowId().intValue()));
            return input;
        }
    });
}

然后,调用此方法并遍历 returned 列表:

List<ApplicationDataBean> filteredTransformedList = populate(workFlowDataBean, items);

for (ApplicationDataBean bean : filteredTransformedList) {
    // do useful things with every filtered and transformed bean
}

关于使用命令式与函数式方法,请使用您认为最好的方法。这种伪功能方法的优点是它可以延迟应用,即当最终迭代 returned 列表时。但是,您应该注意,当您直接修改 ApplicationDataBean input 元素时,原始列表中的元素也会被修改。