2 回答
TA贡献1828条经验 获得超6个赞
为什么要为此使用流?Stream 不是改变对象的正确工具。
使用标准for循环。也使代码更易于理解。
List<Obligation> obligationList = ...;
List<ObligationStatus> statusList = ...;
// For better performance, make a map
Map<String, ObligationStatus> statusMap = new HashMap<>(statusList.size());
for (ObligationStatus status : statusList)
statusMap.put(status.getTopic(), status);
// Assign status values
for (Obligation obligation : obligationList) {
ObligationStatus status = statusMap.get(obligation.getTopic());
if (status != null) {
ob.setStatus(status.getStatus());
ob.setComment(status.getComment());
}
}
如果你想做一些流逻辑,第一部分是一个很好的选择:
// For better performance, make a map
Map<String, ObligationStatus> statusMap = statusList.stream()
.collect(Collectors.toMap(ObligationStatus::getTopic, Function.identity()));
更新
注意到问题代码equalsIgnoreCase(...)在比较topic值时做了。如果确实需要,请将 更改HashMap为不区分大小写TreeMap:
Map<String, ObligationStatus> statusMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
流版本变得复杂,所以最好保持旧式。
TA贡献1891条经验 获得超3个赞
由于您正在修改现有的List,因此无需使用collect.
但是,您可以使用单个forEach. 可以使用和来定位ObligationStatus与实例匹配的实例。ObligationfilterfindFirst
obList.stream().forEach(ob -> {
osList.stream()
.filter(os -> ob.getTopic().equalsIgnoreCase(os.getTopic()))
.findFirst()
.ifPresent (os -> {
ob.setStatus(os.getStatus());
ob.setComment(os.getComment());
});
});
添加回答
举报