2015-04-17 35 views

回答

4

我寧願推薦在這種情況下使用AtomicInteger。它也適用於並行流處理的情況,並且(IMHO)更好:)

1

如果您需要具有唯一的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()); 
+1

我不喜歡這個。這是一個等待發生的多線程問題。此外,ID生成現在被硬編碼到類中,因此後來切換到數據庫生成的ID是不可能的。 –

+0

'c-> methodName'幫了我很多。 – alexander

1

我建議重構,以良好的舊的for-each循環:

int newId = 0; 
for (Car c : cars) { 
    if (c.getId() == null) 
     c.setId(new CarId(newId++)); 
} 

原因:

  • 流的結果不確定性:您設置的ID可能具有隨機順序,這可能會在幾次執行中有所不同(但我認爲您可以忍受這一點)。
  • 使用流時不鼓勵使用副作用。
  • 雖然關於線程使用AtomicInteger是好的(但是速度很慢),但其他解決方案在流出現某些原因並行時會導致問題。