2017-10-28 6 views
2

は、javaの特定のオブジェクトを見つけて変更するには、うまくいく方法ですか?私はそのようなメソッドを持っています:ArrayList内の特定の要素を見つけて変更する

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

たとえば、Java 8のいくつかの他の機能に書き換えることはできますか?私は多くのプロパティを持っていましたので、新しいプロパティをすべて手動で設定することはできませんでした。

+1

あなたは 'Map <...,MyObj>'を使ってオブジェクトに直接アクセスする方が良いかもしれないようです。 –

+0

あなたは答えとして私に例を挙げることができますか? –

答えて

3

あなたは次のようにそれを行うことができ、これは、全体の流れの上に行くだろうし、もっとそして1つのマッチングがある場合でも要素を更新:

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

それとも確信している場合にのみ更新する必要があります一つの要素:データは元の溶液と同じnull要素を持っている場合

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

どちらのソリューションは、それがposiibilityだとあなたはそれを防ぐためにしたい場合は、またaがにnullでないことを確認する必要があり、NullPointerExceptionがスローされます210。

+0

提案 - 'findFirst'に限定してはいけません – nullpointer

+0

@nullpointer OPが何を望んでいるのかよくわかりませんが、私はあなたの提案を答えに統合しました。 – Oleg

+0

私の質問を正しさの必要性に更新しました。setID、setName、setDateなどを手作業で書くことなく、マップの連結プロパティーを自動的に更新することは可能ですか? –

2

あなたはfor-eachループを使用するよりも効率的になり、あなたのケースでlambda expressionを使用している場合、私はわからないが、あなたは

public update(MyObj o) { 

    DATA.forEach(objToModify -> { 

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

をやろうとしているものを行うには、ラムダ式を使用することができます。