Java 8stream映射到按值sorting的键列表

我有映射Map<Type, Long> countByType ,我想有一个列表已按sorting(最小到最大)的键相应的值。 我的尝试是:

 countByType.entrySet().stream().sorted().collect(Collectors.toList()); 

然而,这只是给了我一个条目列表,我怎样才能得到一个types的列表,而不会失去顺序?

你说你想按价值sorting,但是在你的代码中没有。 传递一个lambda(或方法引用)来sorted ,告诉它如何sorting。

你想要钥匙; 使用map将条目转换为键。

 List<Type> types = countByType.entrySet().stream() .sorted(Comparator.comparing(Map.Entry::getValue)) .map(Map.Entry::getKey) .collect(Collectors.toList()); 

您必须根据条目的值对自定义比较器进行sorting。 然后在收集之前select所有的按键

 countByType.entrySet() .stream() .sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue())) // custom Comparator .map(e -> e.getKey()) .collect(Collectors.toList()); 

您可以按照下面的值对图进行sorting, 这里是更多示例

 //Sort a Map by their Value. Map<Integer, String> random = new HashMap<Integer, String>(); random.put(1,"z"); random.put(6,"k"); random.put(5,"a"); random.put(3,"f"); random.put(9,"c"); Map<Integer, String> sortedMap = random.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray())); 
  Map<Integer, String> map = new HashMap<>(); map.put(1, "B"); map.put(2, "C"); map.put(3, "D"); map.put(4, "A"); List<String> list = map.values().stream() .sorted() .collect(Collectors.toList()); 

输出:[A,B,C,D]

以下是StreamEx的简单解决scheme

 EntryStream.of(countByType).sortedBy(e -> e.getValue()).keys().toList();