当前位置: 首页 > 面试题库 >

比较然后比较给出编译错误

姚烨
2023-03-14
问题内容

我正在尝试List使用Java8按名称对员工进行排序,然后按年龄进行排序Comparator,我在下面创建了Comparator该代码,但它给了我一个编译器错误

Type mismatch: cannot convert from Comparator<Object> to <unknown>

    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

或通过创建两个Compartors和链

    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

我已经Comparator<String>在左侧指定了类型,但是为什么自动类型推断没有找到正确的类型并期望明确指定。

有人可以澄清吗?

这是代码

    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]

问题答案:

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

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

如果您看一下这个答案,它的参数中有类似的类型声明Comparator.comparing()

您的方法,显式地给出的类型参数comparing(),显然也是可行的。

对于您的另一种方法,声明两个比较器,我非常有信心,在这种情况下,Java可以String像常规一样从分配的左侧进行推断List <String> =new ArrayList<>();。当您继续调用thenComparing()相同的表达式时,Java不再能看到左侧的类型是相关的。有点像int size = new ArrayList<>().size();这样也可以:

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


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

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

  • 问题内容: 明天我要进行考试,但我听不懂书中的解释,感谢您的帮助: 输出: 为什么这会打印两个大小相同的负数而不是正负数? 问题答案: 由于无声整数溢出:is 和is ,因此is ,即is ,根据定义,它对于整数而言太大。因此它溢出并变成… 您还可以检查: 打印相同的东西。 从技术上讲,结果由Java语言规范#15.18.2定义: 如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码

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

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

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