将EntrySet流收集到LinkedHashMap

时间:2018-10-24 17:55:50

标签: java hashmap java-stream linkedhashmap

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

我有一个JSON资源存储在LinkedHashMap<String, Object> resources中。 然后,通过流传输此地图的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>。我该如何实现?

2 个答案:

答案 0 :(得分:6)

您可以使用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 而导致的,当找到重复的键时,它返回找到的第二个键的值。第四部分是 mapFactory ,供应商提供了一个新的空Map,将结果插入其中。

答案 1 :(得分:1)

使用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");