2017-10-28 73 views
2

是一些優雅的方式來查找和修改java中的某些特定對象?我有這樣的方法:查找並修改ArrayList中的特定元素

public update(MyObj o) { 
    for (MyObj objToModify: DATA) { 
     if (objToModify.getId() == o.getId()) { 
      objToModify.setName(o.getName()); 
      // and so on ... 
     } 
    } 
} 

是可以重寫爲lambda例如,或Java 8的其他功能?我有很多屬性,所以我會更喜歡某些選項,我無法手動設置所有新屬性。

+1

看起來像使用'Map <...,MyObj>'來更好地直接訪問該對象。 –

+0

你能舉個例子嗎? –

回答

3

你可以做到這一點通過以下方式,這會在整個流和更新的元素,即使有更多的則是一個匹配:

DATA.stream().filter(a -> a.getId() == o.getId()).forEach(a -> a.setName(o.getName())); 

或者,如果你相信,你只需要更新一個元素:

DATA.stream().filter(a -> a.getId() == o.getId()). 
    findAny().ifPresent(a -> a.setName(o.getName())); 

兩種解決方案都將引發NullPointerException數據是否已經null元素一樣你原來的解決方案,如果它是一個posiibility,你想阻止它,你還需要檢查a不空210。

+0

建議 - 不應該被限制爲'findFirst' – nullpointer

+0

@nullpointer不確定OP需要什麼,但我將你的建議集成在答案中。 – Oleg

+0

我已經更新我的問題到正確的需要,是否可能地圖綁定屬性自動更新,而無需手動編寫setID,setName,setDate等? –

2

您可以使用lambda表達式做你正在嘗試做

public update(MyObj o) { 

    DATA.forEach(objToModify -> { 

     if (objToModify.getId() == o.getId()) { 
      objToModify.setName(o.getName()); 
      // and so on ... 
     } 
    }); 
} 

雖然我如果在你的情況下,使用lambda expression會比使用for-each循環更高效的我不知道。