web-dev-qa-db-ja.com

LinkedHashMapへのEntrySetのストリームを収集します

ストリームをLinkedHashMap<String, Object>に収集したい。

LinkedHashMap<String, Object> resourcesに保存されているJSONリソースがあります。次に、このマップのJSONをストリーミングして、EntrySet要素を除外します。現在、ストリームの要素を通常のHashMapに収集しています。しかし、この後、マップに他の要素を追加しています。これらの要素を挿入された順序にします。

final List<String> keys = Arrays.asList("status", "createdDate");

Map<String, Object> result = resources.entrySet()
        .stream()
        .filter(e -> keys.contains(e.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

result.put("date", "someDate");
return result;

そのため、ストリームをLinkedHashMap<String, Object>に収集したいと思います。どうすればこれを達成できますか?

4
xtra

これはStreamで実行できます。

Map<String, Object> result = resources.entrySet()
            .stream()
            .filter(e -> keys.contains(e.getKey()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));

一部 (x, y) -> ymergeFunctionが原因です。重複するキーが見つかると、見つかった2番目のキーの値が返されます。 4番目の部分はmapFactoryであり、結果が挿入される新しい空のマップを提供するサプライヤです。

13
Amin

Map.forEachを使用してこれを行う別の方法は次のとおりです。

Map<String, Object> result = new LinkedHashMap<>();
resources.forEach((key, value) -> {
    if (keys.contains(key)) {
        result.put(key, value);
    }
});
result.put("date", "someDate");

オプションとしてkeySetを繰り返すことを検討できる場合:

Map<String, Object> result = new LinkedHashMap<>();
resources.keySet().stream()
        .filter(keys::contains)
        .forEach(key -> result.put(key,resources.get(key)));
result.put("date", "someDate");
2
Naman