如何在迭代时更新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
元素时,原始列表中的元素也会被修改。
我正在尝试更新 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
元素时,原始列表中的元素也会被修改。