2017-08-23 22 views
1

この問題には1行のオプションがあるのだろうかと思います。リスト内のJava 8反復リストとstream.map()

私はaccountNumberNameMapに口座番号と名前Map<String, String> accountNumberNameMap サンプルデータのマップを持っている

...のように、DataA

public class DataA { 
    private String name; 
    private String email; 
    private List<String> accountNumberName; 
} 

サンプル値が

name="user1",email="[email protected]",accountNumberName=["100", "101", "102"]などでBeanをされていlike、

{"100"="Account A", "101" = "Account B", "102" = "Account C"}

は私がDATAA List<DataA>のコレクションはaccountNumberNameMapを使用して、すべての私の「リスト」内部accountNumberNameが持っているaccount number - Account name変換する必要がありDataA

name="user1",email="[email protected]",accountNumberName=["100 - Account A", "101 - Account B", "102 - Account C"]に変換したいです。

私は、カップルのループを使用して、アカウント番号 - アカウント名にアカウント番号を変換することでそれを行うことができます。それを行うためにJava8ストリームに簡単な方法があるかどうかわかりません。

+0

マップにアカウント番号が含まれていない場合はどうしますか? –

+0

私は 'accountNumberNameMap.getOrDefault(acc、" ")'がそれを処理すべきだと思います。 – Bala

+0

質問はそれをコード化する方法ではなく、その振る舞いをどのようにすべきかということでした。だから、あなたの答えは、左のジョインのように、空の文字列を使用することです。 –

答えて

2

forEachreplaceAllと組み合わせて使用​​することができます(簡略化のためaccountNumberNameにアクセスできると仮定しましたが、設定者からも簡単に変更できます)。その後、

list.replaceAll(d -> new DataA(d.name, d.email, d.accountNumberName.stream().map(name -> name + " - " + accountNumberNameMap.getOrDefault(name, "")).collect(toList()))); 

(とあなたがしたくない場合:

list.forEach(d -> d.accountNumberName.replaceAll(acc -> acc + " - " + accountNumberNameMap.getOrDefault(acc, ""))); 

既存のインスタンスを変更したくない場合は、それが(コピーコンストラクタが存在すると仮定した場合)、この方法で行うことができますreplaceAllの代わりに元のリストを変更してストリームのみを収集する)

+0

私はリストのインスタンスを直接更新したいと思っていました。 – Bala

関連する問題