我想使用Stream by key在Java 8中对地图进行排序,但顺序是在有序集中定义的。
订购的关键:
LinkedHashSet<String> keysToOrderBy = new LinkedHashSet<String>();
keysToOrderBy.add("b");
keysToOrderBy.add("c");
keysToOrderBy.add("d");
keysToOrderBy.add("a");
keysToOrderBy.add("e");
地图:
Map<String, Object> map = new Map<String, Object>();
map.put("a",...);
map.put("b",...);
map.put("c",...);
使用并行默认值的流排序:
LinkedHashMap<String, Object> ordered =
map.entrySet()
.stream()
.parallel()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v1,
LinkedHashMap::new
));
新地图的顺序应为:
"b"
"c"
"d"
"a"
"e"
我假设我必须使用自定义比较器?
答案 0 :(得分:2)
您不一定要使用自定义比较器;你只是迭代已排序的元素而不是未排序的元素。
LinkedHashMap<String, Object> ordered = keysToOrderBy.stream()
.filter(map::containsKey)
.collect(Collectors.toMap(
e -> e,
map::get,
(v1, v2) -> v1, LinkedHashMap::new));