我有以下代码

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()));

最佳答案

您正在以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());
}

07-21 14:42
查看更多