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

比较和再比较会产生编译错误

芮安顺
2023-03-14

我正在尝试使用Java8比较器按姓名和年龄对员工列表进行排序,我在下面创建了比较器,但它给我一个编译器错误

类型不匹配:无法从比较器转换

    Comparator<String> c = Comparator.comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //compile error

但如果我显式指定类型

    Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //works

或者通过创建两个比较器s和链

    Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
    Comparator<String> age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
    Comparator<String> cc = name.thenComparing(age); //works

我已经指定了比较器的类型

有人能澄清一下吗?

这是代码

    String[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" };
    Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
    List<String> sorted = Arrays.stream(arr).sorted(c).collect(Collectors.toList());
    System.out.println(sorted);

输出

[alan 19, alan 25, mario 25, mario 30]

共有1个答案

王季萌
2023-03-14
匿名用户

Java需要知道所有变量的类型。在许多lambda中,它可以推断一个类型,但在您的第一个代码片段中,它无法猜测s的类型。我认为解决这个问题的标准方法是显式声明它:

    Comparator<String> c = Comparator.comparing((String s) -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));

如果您查看这个答案,它在Comparator的参数中有一个类似的类型声明。比较()。

您的方法显式给出了比较()的类型参数,显然也有效。

对于您的另一个方法,声明两个比较器,我很有信心在这种情况下Java可以从赋值左侧的String中推断,就像在传统的List中一样

    Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
    Comparator<String> c = name.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));

 类似资料:
  • 问题内容: 我正在尝试使用Java8按名称对员工进行排序,然后按年龄进行排序,我在下面创建了该代码,但它给了我一个编译器错误 但是如果我明确指定类型,它就可以工作 或通过创建两个s和链 我已经在左侧指定了类型,但是为什么自动类型推断没有找到正确的类型并期望明确指定。 有人可以澄清吗? 这是代码 输出 问题答案: Java需要知道所有变量的类型。在许多lambda中,它可以推断类型,但是在您的第一个

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • Java在进行比较时抛出的错误是: 然后比较的方法(比较器 你知道发生了什么事吗?

  • Snowpack Snowpack 也是一个与 Vite 十分类似的非构建式原生 ESM 开发服务器。除了不同的实现细节外,这两个项目在技术上比传统工具有很多共同优势。Vite 的依赖预绑定也受到了 Snowpack v1(现在是 esinstall)的启发。这两个项目之间的一些主要区别是: 生产构建 Snowpack 的默认构建输出是未打包的:它将每个文件转换为单独的构建模块,然后将这些模块提供

  • 比较两个输入的大小 用法 Your browser does not support the video tag. 案例:小台灯 功能:当随机数A>B时,灯亮;当随机数A<B时灯灭 工作原理 在配置面板中设置操作符(>,<,=),将两个数值连接到节点的输入端。如果满足比较条件,结果将输出YES。否则将输出NO。

  • 比较输入的数值与原来的数值。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:00:00后,响起猫叫声小闹钟 工作原理 输入的值将用来被比较。如果这个值满足条件,那么这个节点将会输出“yes”;否则,输出“no”。 提示: 如果输入的是一个字符串,节点会尝试将它转化为数字;如果失败,将会输出“no” 如果输入的是一个对象