我正在尝试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
或通过创建两个Compartor
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
我已经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。