当前位置: 首页 > 知识库问答 >
问题:

当添加到ArrayList时,如何避免“lambda表达式中参数类型不兼容”?

袁晟
2023-03-14

我有以下代码

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;
}
Error:(20, 16) java: incompatible types: incompatible parameter types in lambda expression

给出答案后,更正是将forEach中的lambda替换为

.forEach((entry) -> myList.add(entry.getKey()));

共有1个答案

冀崇凛
2023-03-14

您将以Java7的方式进行。从foreach内部修改外部数据结构并不是Streams API的使用方式。Streams API文档在java.util.stream包摘要的副作用一节中特别警告不要使用这种方法

使用collect,而不是从foreach:

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());
}
 类似资料:
  • 问题内容: 在某个AngularJS视频中,我看到了如何避免在Javascript解析表达式之前将其可见。但是我不记得它是怎么做到的… 我有一个,我想说“正在加载…” AngularJS有机会来分析它。如何才能做到这一点? 问题答案: 就像其他人提到的那样,使用ng-cloak,但是如果它是第一个加载到您的页面中的内容,还可以将以下内容添加到您的CSS中。 这将确保您的div模板是隐藏的。在该di

  • 我有一个用户表,其中我有(Id,reportingUserId)。reportingUserId 包含一个字符串,该字符串表示用户向其报告的用户 Id(上级)。现在,在删除用户时,我应该检查是否有任何用户向此用户报告。如果它们存在,那么我应该将其报告用户 Id 值更改为上级的用户 Id。此处报告用户是当前用户的劣势列表。 现在,当我这样做的时候,我得到了lambda表达式中使用的在第二个if条件的

  • 问题内容: 我想用datatyp uint8添加numpy数组。我知道这些数组中的值可能足够大,以至于发生溢出。所以我得到类似: 现在,a是。但是,我希望让uint8太大的值成为uint8允许的最大值,而不是溢出。所以我想要的结果是。 我可以使用以下代码获得此结果: 问题是我的数组很大,因此创建具有更大数据类型的第三个数组可能是内存问题。是否有一种快速且更节省内存的方式来实现上述结果? 问题答案:

  • 我正在尝试在Java中使用Lambda表达式来理解以下方法参考代码: 我的问题是,为什么函数sameTemp只有一个参数?接口声明它必须有2个参数,所以对我来说没有意义。也许hTemp实例变量对这两个都足够了?我从Java完整参考书中获得了这一点,作者在那里解释了这一点: 块引用 在程序中,请注意HighTemp有两个实例方法:

  • 我从转换内部传统的for循环开始,在使用AtomicInteger对计数器变量进行排序时遇到了同样的问题,但不确定如何对arrayList进行排序,而且我也无法在lambda块内定义arrayList,因为它与外部while循环中存在的I变量有依赖关系。 任何帮助都将非常感谢!!!提前道谢。 下面是我的代码片段:- 使用Java8streams/lambdas/foreach更改/优化以上函数为更

  • 我使用for循环将学生详细信息添加到ArrayList。当我给第二个学生提供详细信息时,它会覆盖第一个数据。螺柱类 将数据添加到ArrayList的主类。 输出:第二个数据[2,2]后的实际输出辊数[1]。预期输出应为卷号: A1姓名: F1 L1性别:男性年龄: 11体育赛事:标枪 报名号:A2姓名:F2 L2性别:女年龄:14体育项目:100米跑 报名号:A3姓名:F3 L3性别:男性年龄:1