收集 EntrySet 的流到 LinkedHashMap

2022-09-02 02:19:59

我想将流收集到 .LinkedHashMap<String, Object>

我有一个存储在 中的资源。然后,我通过流式传输此映射来过滤掉元素。目前,我正在将流的元素收集到常规.但在此之后,我正在向地图添加其他元素。我希望这些元素按插入的顺序排列。JSONLinkedHashMap<String, Object> resourcesJSONEntrySetHashMap

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>


答案 1

您可以使用以下命令执行此操作: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));

该部分是因为mergeFunction在找到重复键时,它返回找到的第二个键的值。第四部分是mapFactory,供应商提供一个新的空Map,结果将入其中。(x, y) -> y


答案 2

执行此操作的另一种方法是: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");