我有以下代码
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
编辑:
鉴于答案,更正是用for
替换forEach中的lambda.forEach((entry) -> myList.add(entry.getKey()));
答案 0 :(得分:4)
entrySet()
会返回一组Pair<K, V>
。
forEach()
&#39;} lambda因此采用该类型的单个参数;不是两个整数参数。
答案 1 :(得分:3)
你是以java7-ish的方式进行的。修改内部forEach
内部的外部数据结构并不意味着如何使用Streams API。 Streams API文档专门警告java.util.stream
package summary
请使用forEach
:
collect
内附加到列表或地图。
import static java.util.Comparator.reverseOrder;
import static java.util.Map.Entry.comparingByValue;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
public static List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer, Long> freq = Arrays.stream(nums).boxed()
.collect(groupingBy(x->x, counting()));
return freq.entrySet()
.stream()
.sorted(comparingByValue(reverseOrder()))
.limit(k)
.map(Map.Entry::getKey)
.collect(toList());
}