将EntrySet流收集到LinkedHashMap

xtr*_*tra 4 java hashmap linkedhashmap java-stream

我想收集流到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;
Run Code Online (Sandbox Code Playgroud)

这就是为什么我想收集流到一个LinkedHashMap<String, Object>.我怎样才能做到这一点?

Ami*_*min 11

你可以这样做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));
Run Code Online (Sandbox Code Playgroud)

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


Dze*_*i96 6

正如其他人指出的那样,如果您想提供自己的mapFactory,您还必须提供合并功能。接受的答案实际上改变了三参数函数的默认行为,即遇到重复键时抛出异常。此实现保留了原始行为:

LinkedHashMap lmp = collection.
                .stream()
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (v1, v2) -> {throw new IllegalStateException("YOUR MESSAGE HERE");},
                        LinkedHashMap::new
                ));
Run Code Online (Sandbox Code Playgroud)