Java中调用String.length()返回值的compareTo()报错原因解析
String.length()调用compareTo()报错的原因
错误根源分析
在strVal2的代码中,a.length().compareTo(a.length())存在两个致命问题:
- 基本类型无实例方法:
String.length()返回的是int——Java的基本数据类型,而compareTo()是Comparable接口定义的实例方法,只有Integer这类包装类才实现了该接口。基本类型本身不具备任何实例方法,因此直接调用compareTo()会触发编译错误。 - 比较逻辑完全失效:即便这里用的是包装类,
a.length().compareTo(a.length())是拿字符串自身的长度和自己比较,结果永远为0,排序时所有元素都会被判定为相等,排序逻辑毫无意义。
正确写法示例
如果想用compareTo风格的逻辑比较字符串长度,需要将基本类型int转为包装类Integer,或者直接使用Integer的静态比较方法:
方式1:使用Integer静态方法(推荐)
Optional<String> strVal2 = strList.stream() .sorted((a, b) -> Integer.compare(a.length(), b.length())) .skip(1).findFirst();
方式2:手动装箱后调用compareTo
Optional<String> strVal2 = strList.stream() .sorted((a, b) -> Integer.valueOf(a.length()).compareTo(b.length())) .skip(1).findFirst();
补充说明
Integer能直接调用compareTo(),是因为它作为int的包装类,实现了Comparable<Integer>接口;而int作为基本类型,没有方法调用能力,必须借助包装类才能使用Comparable相关方法。
内容的提问来源于stack exchange,提问作者Ajit A Ankalle
相关产品推荐
相关产品推荐

