有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java streams api通过比较器对映射值进行排序

我有一个Map,希望通过Comparator将结果放入LinkedHashMap来对值进行排序

Map<String, User> sorted = test.getUsers()
                .entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue(SORT_BY_NAME))
                .collect(LinkedHashMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()),
                        LinkedHashMap::putAll);
test.setUsers(sorted);

所有的工作都可以,但是,我想知道这是否可以简化

实际上,我创建了一个新的Map,并将这个新的Map放入setUsers()。我可以直接更改流而不创建新的LinkedHashMap

使用Collections.sort(Comparator)可以直接对列表进行排序。但是,Collections.sort不适用于地图


共 (2) 个答案

  1. # 1 楼答案

    为什么不使用Collectors.toMap()

    .collect(Collectors.toMap(
            Entry::getKey,
            Entry::getValue,
            (a, b) -> { throw new AssertionError("impossible"); },
            LinkedHashMap::new));
    
  2. # 2 楼答案

    您无法对不支持数组样式索引的集合执行就地排序,因此对于映射来说,这是不可能的(除非您在LinkedHashMap上使用类似于选择排序的方法,但这是个坏主意)。创建新地图是不可避免的。不过,你仍然可以通过遵循shmosel的答案来简化它