2017-11-17 12 views
1

私はマップを持っており、各エントリの値を操作して、変更されたマップを返す必要があります。私はそれを動作させることができましたが、結果のマップには空の値を持つエントリが含まれていましたが、これらのエントリを削除したいが、Java 8ストリームAPIではできません。ここjava 8ストリームAPIマップから空の値を外す

は私の元のコードです:私は、マップから空の/ NULL値を持つエントリを削除する方法

userTests.entrySet().stream() 
     .forEach(entry -> entry.setValue(filterByType(entry.getValue(), supportedTypes))); 

userTests.entrySet().stream().filter(entry -> !entry.getValue().isEmpty()); 
     return userTests; 
  1. Map<String, List<Test>> filtered = Maps.newHashMap(); 
    for (String userId : userTests.keySet()) { 
        List<Test> tests = userTests.get(userId); 
        List<Test> filteredTests = filterByType(tests, supportedTypes); 
    
        if (!CollectionUtils.isEmpty(filteredTests)) { 
         filtered.put(userId, filteredTests); 
        } 
    } 
    return filtered; 
    

    、ここでは私のJava 8のストリームAPIバージョンですか?

  2. ストリームAPIでコードを書くためのより良い方法があり、これまでのところ、私はそれが、これは効果がありません
+0

どこ 'filterByType'メソッドの定義は? – Dimitri

答えて

1

userTests.entrySet().stream().filter(entry -> !entry.getValue().isEmpty()); 私の元のコードよりはましだが表示されません。 filterはターミナル操作ではありません。あなたが新しいマップにストリームの結果を収集する必要があり

HashMap<String, String> map = new HashMap<>(); 
map.put("s",""); 
map.put("not empty", "not empty"); 

Map<String, String> notEmtpy = map.entrySet().stream() 
    .filter(e -> !e.getValue().isEmpty()) 
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
2

あなたがする必要が新しいMapを収集する(例えば)

例えば

new HashMap<String, List<String>>(). 
       entrySet(). 
       stream(). 
       filter(entry -> !entry.getValue().isEmpty()). 
       collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

現在のところ、中間(フィルタリング)操作でストリームを返すだけです。 terminal操作でこれが実行され、目的のコレクションが得られます。

0

インラインフィルタを挿入してみてください。

userTests.entrySet().stream().filter(entry -> !entry.getValue().isEmpty()) 
.forEach(entry -> entry.setValue(filterByType(entry.getValue(), supportedTypes))); 
関連する問題