2017-12-27 18 views
-3

をnullにデフォルト値を与える私は[以下に示すように、オブジェクトのリストを持っている時間数がヌルのJava 8ストリーム要素

ある要素[Java(登録商標)、10時間]
にデフォルト値を与えたいと思いますパイソン、2時間]
[ノード、1時間]
[C、NULL] < --- NULL
[ルビー、4時間]
[スイフト、ヌル] < --- NULL
[PHP、 2時間]

予想

[Java(登録商標)、10時間]
[パイソン、2時間]
[ノード、1時間]
[C、はdefaultValue]
[ルビー、4時間]
[スイフト、はdefaultValue]
[PHP、2時間]

+0

ストリームが必要ですが、forループで十分ですか? –

+1

これまでに試したことを示してください。 –

答えて

0
List<String[]> list = Arrays.asList(
      new String[] {"java", "10 housrs"}, 
      new String[] {"python", null} 
    ); 
    list.stream().filter(pair -> pair[1] == null).forEach(pair -> pair[1] = "default value"); 
    list.forEach(pair -> System.out.printf("%s => %s\n", pair[0], pair[1])); 
あなたはあなたが望むものを達成するために、マップ文の中 ifを使用することができます

==

java => 10 housrs 
python => default value 
+5

'map'を使って副作用を避ける – Dummy

+0

@Dummyマップを使うと、リスト内の要素の順序が変わることがあります。 –

+1

元の質問から、その順序は明らかに問題ではありません – Dummy

1

List<String[]> newList = list.stream() 
    .map(e-> { 
     String newVal = e[1]; 
     if(newVal == null){ 
      newVal = "defaultValue"; 
     } 
     return new String[]{e[0], newVal}; 
    }) 
    .collect(Collectors.toList()); 

あなたは、私が地図操作で新しい配列を作成していることがわかります。これは既存のものを編集することよりも優先されます。これは副作用が起こらないためです。詳細情報については

についてmap()the docs

を見ている。しかし、最初の場所でforeach -loopを使用しない理由は、その方法は、あなたが実際に達成したいかを理解することが容易ですまたStreamを作成するには、オーバーヘッドはありません:

for(String[] e : list){ 
    if(e[1] == null){ 
     e[1] = "defaultValue"; 
    } 
} 

ちょうどあなたがちょうど古き良きループを使用することができたときにストリームを使用するために自分自身を強制することは常に良いアイデアではありません。

関連する問題