将 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");