我试图在遍历它的列表时更新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()实际上将返回列表的惰性计算视图,这意味着apply()中的所有内容仅在您开始迭代转换的集合时发生。因此,您不能以现在使用的方式使用该方法,因为如果不使用转换后的List则不会调用apply()

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

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


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

10-07 16:07