2 回答

TA貢獻1828條經驗 獲得超6個贊
為什么要為此使用流?Stream 不是改變對象的正確工具。
使用標準for循環(huán)。也使代碼更易于理解。
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為不區(qū)分大小寫TreeMap:
Map<String, ObligationStatus> statusMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
流版本變得復雜,所以最好保持舊式。

TA貢獻1891條經驗 獲得超3個贊
由于您正在修改現(xiàn)有的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());
});
});
添加回答
舉報