我想将流收集到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>
。我该如何实现?
答案 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");