7

Java 8 のストリーム API を初めて探しています。マップから要素を削除するフィルターを作成しようとしました。

これは私の地図です:

Map<String, Integer> m = new HashMap<>();

値 <= 0 のエントリを削除したいので、フィルタを適用して新しいマップ (Map<String, Integer>) を取得したいと考えています。

これは私が試してきたことです:

m.entrySet().stream().filter( p -> p.getValue() > 0).collect(Collectors.groupingBy(s -> s.getKey()));    

HashMap<String, ArrayList<HashMap$Node>> を取得します。だから、私が探していたものではありません。

私も試しました:

m.entrySet().stream().filter( p -> p.getValue() > 0).collect(Collectors.groupingBy(Map::Entry::getKey, Map::Entry::getValue));

これにより、次のことが発生します。

// Error:(50, 132) java: method reference not expected here

基本的に、新しいマップの値を構築する方法がわかりません。

これはCollectors の javadoc です。彼らは groupingBy の例をいくつか書いていますが、私はそれを機能させることができませんでした。

では、自分の Map を思いどおりに構築するには、 collectをどのように記述すればよいでしょうか?

4

1 に答える 1

11

ストリーム アイテムを再度グループ化する必要はありません。それらは既に「マップ」されています。それらを収集するだけで済みます。

m.entrySet().stream()
    .filter(p -> p.getValue() > 0)
    .collect(toMap(Entry::getKey, Entry::getValue));

インポート:

import java.util.Map.Entry;
import static java.util.stream.Collectors.toMap;
于 2014-03-26T18:28:28.280 に答える