Java 8给定一组有序键,按键排序

时间:2015-12-30 16:53:21

标签: java sorting java-8 java-stream

我想使用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"

我假设我必须使用自定义比较器?

1 个答案:

答案 0 :(得分:2)

您不一定要使用自定义比较器;你只是迭代已排序的元素而不是未排序的元素。

LinkedHashMap<String, Object> ordered = keysToOrderBy.stream()
    .filter(map::containsKey)
    .collect(Collectors.toMap(
                e -> e,
                map::get, 
                (v1, v2) -> v1, LinkedHashMap::new));