2015-11-24 19 views
8

ストリームとフィルタを使用して条件を絞り込み、必要に応じてマップから削除する方法を解明しようとしています。Java 8ストリーム - 条件に基づいたイテレータのマップと削除

Iterator<Map.Entry<String,Object>> iter = listOfPossibleParams.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry<String,Object> entry = iter.next(); 
    if(entry.getValue() instanceof String) { 
     if (StringUtils.isBlank((String) entry.getValue())) { 
      iter.remove(); 
     } 
    } 
} 

私が最初にこのような何かを考えていたが、それは構文エラーとしてobiviously doesntの仕事を:あなたは場所に地図を変更することができる場合

listOfPossibleParams.entrySet() 
      .stream() 
      .filter(p -> p.getValue() instanceof String) 
      .removeIf(e -> StringUtils.isBlank((String)e.getValue())); 
+0

エラーを教えてください。 – VDanyliuk

答えて

12

は、あなたが行うことができます:

listOfPossibleParams.values() 
        .removeIf(v -> v instanceof String && StringUtils.isBlank((String) v)); 
あなたが代わりに新しい地図を構築したい場合は

、あなたが持っている可能性があり:

listOfPossibleParams.entrySet() 
        .stream() 
        .filter(p -> { 
         Object v = p.getValue(); 
         return !(v instanceof String) || !StringUtils.isBlank((String) v); 
        }) 
        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); 
+1

それはトリックを行うように見えた@屯木 - ありがとう!私は削除述語を使用する前にそれをフィルタリングしなければならないと思いました。ユニットテストに合格しているようです。 –

+2

@BitzalあなたはTDDをやっている、素敵:) – Tunaki

関連する問題