将 EntrySet 的流收集到 LinkedHashMap
Collect stream of EntrySet to LinkedHashMap
我想将流收集到LinkedHashMap<String, Object>
。
我有一个 JSON
资源存储在 LinkedHashMap<String, Object> resources
中。
然后我通过流式传输此地图的 EntrySet
来过滤掉 JSON
元素。
目前我正在将流的元素收集到常规 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当找到重复的键时,它returns找到的第二个键的值。第四部分是 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");
我想将流收集到LinkedHashMap<String, Object>
。
我有一个 JSON
资源存储在 LinkedHashMap<String, Object> resources
中。
然后我通过流式传输此地图的 EntrySet
来过滤掉 JSON
元素。
目前我正在将流的元素收集到常规 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当找到重复的键时,它returns找到的第二个键的值。第四部分是 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");