ストリームを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>
に収集したいと思います。どうすればこれを達成できますか?
これは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) -> y
はmergeFunctionが原因です。重複するキーが見つかると、見つかった2番目のキーの値が返されます。 4番目の部分はmapFactoryであり、結果が挿入される新しい空のマップを提供するサプライヤです。
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");