我有一个整数列表,并希望通过2个属性以排序的方式打印所有元素:列表大小和列表中元素的总和。我在流thenComparing
方法上进行了阅读,但是每当我尝试使用它时都会显示一个错误。
我写了一些能正常工作的代码,但想知道是否还有其他更干净的方法可以做到这一点。预先感谢!
Map<List<Integer>, Double> entropies = new HashMap<>();
// Extra code removed
entropies.keySet()
.stream().sorted(Comparator.comparingInt(o -> {
List<Integer> a = (List<Integer>) o;
return a.size();
}).thenComparingInt(o -> {
List<Integer> a = (List<Integer>) o;
return a.stream().mapToInt(Integer::intValue).sum();
}))
.forEach(key -> logger.debug("{} => {}", key, entropies.get(key)));
与实际输出相同,但不进行强制转换。
答案 0 :(得分:3)
以下方法应该起作用:
entropies.keySet()
.stream().sorted(Comparator.<List<Integer>>comparingInt(List::size)
.thenComparingInt(o -> o.stream().mapToInt(Integer::intValue).sum()))
.forEach(key -> logger.debug("{} => {}", key, entropies.get(key)));
由于Comparator.comparingInt
无法将类型推断为List>。调用时的类型提示使编译器知道实际的类型。这是因为sorted
方法期望使用Comparator<? super List<Integer>> comparator
,因此从技术上讲,您的比较器可以具有List的任何超类,因此您需要显式指定它是哪个超类。