【发布时间】:2016-05-09 22:07:25
【问题描述】:
我有以下代码
public static List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> myList = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
if (!map.containsKey(n)) map.put(n, 1);
else map.put(n, map.get(n) + 1);
}
map.entrySet().stream()
.sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
.limit(k)
.forEach((key, value) -> myList.add(key));
return myList;
}
forEach 抛出错误
Error:(20, 16) java: incompatible types: incompatible parameter types in lambda expression
如何修复/避免此错误?我不太确定如何在此处应用解释问题的答案:Lambda Expression and generic method
编辑:
鉴于答案,更正方法是将 forEach 中的 lambda 替换为
.forEach((entry) -> myList.add(entry.getKey()));
【问题讨论】:
-
遗憾的是 Java 不允许元组解包。
-
P.S.问题标题很糟糕——答案肯定是“不要提供不兼容的参数”。
-
@Boris the Spider:但是编写一个将
BiConsumer<K,V>转换为Consumer<Map.Entry<K,V>>的实用方法是微不足道的…… -
@Boris the Spider:更糟糕的是,Java 没有元组……
-
@AR7:请注意,对于您的第一个循环,您可以使用已接受答案的流解决方案,但是当您使用循环时,您可以将
if (!map.containsKey(n)) map.put(n, 1); else map.put(n, map.get(n) + 1);替换为map.merge(n, 1, Integer::sum);。所以不仅有 Stream API,Collection API 也有很多有用的新方法。
标签: java arraylist lambda java-8 java-stream