嗨,我有一個代碼如下。用lambda調用帶有「outside」變量的方法作爲參數的Java foreach
int newId =0;
cars.stream()
.filter(c -> c.getId() == null)
.forEach(c -> setId(new CarId(newId++));
但也不能因爲變量newId
編譯不最終。是否有可能以某種方式修復它?謝謝。
嗨,我有一個代碼如下。用lambda調用帶有「outside」變量的方法作爲參數的Java foreach
int newId =0;
cars.stream()
.filter(c -> c.getId() == null)
.forEach(c -> setId(new CarId(newId++));
但也不能因爲變量newId
編譯不最終。是否有可能以某種方式修復它?謝謝。
我寧願推薦在這種情況下使用AtomicInteger
。它也適用於並行流處理的情況,並且(IMHO)更好:)
如果您需要具有唯一的ID(而不僅僅是順序ID),那麼您可以將newId
變量移動爲(私有? )CarID
類的靜態成員。
public class CarID {
protected static int newID = 0;
private final int id;
public CarID(){
this.id = CarID.newID++;
}
}
(可能還會添加一些線程安全行爲)。
然後,你可以這樣做:
cars.stream()
.filter(c -> c.getId() == null)
.forEach(c -> setId(new CarId());
我建議重構,以良好的舊的for-each循環:
int newId = 0;
for (Car c : cars) {
if (c.getId() == null)
c.setId(new CarId(newId++));
}
原因:
AtomicInteger
是好的(但是速度很慢),但其他解決方案在流出現某些原因並行時會導致問題。
我不喜歡這個。這是一個等待發生的多線程問題。此外,ID生成現在被硬編碼到類中,因此後來切換到數據庫生成的ID是不可能的。 –
'c-> methodName'幫了我很多。 – alexander