如何实现基于字符串属性的不区分大小写排序?解决代码报错
问题:如何修正代码实现不区分大小写的排序?
现有代码可正常运行,但排序时会区分大小写,导致结果不符合自然字母顺序:
List<Pair<IContributionItem, String>> itemsList = new ArrayList<>(); Comparator<Pair<IContributionItem, String>> filePathComparator = Comparator.comparing(Pair<IContributionItem, String>::getPathToFile); itemsList = itemsList.stream().sorted(filePathComparator).collect(Collectors.toList());
尝试使用String.CASE_INSENSITIVE_ORDER修改代码时写法错误,触发报错:String.CASE_INSENSITIVE_ORDER cannot be resolved to a type,请问该如何修正代码以实现不区分大小写的排序?
解决方案
你出现报错的原因是误用了String.CASE_INSENSITIVE_ORDER的用法:它是一个已经实例化好的Comparator<String>对象,并非一个类型,不能直接作为Comparator.comparing的参数类型使用。
正确的做法是在Comparator.comparing方法中传入第二个参数——指定字符串的比较规则,直接使用String.CASE_INSENSITIVE_ORDER即可:
List<Pair<IContributionItem, String>> itemsList = new ArrayList<>(); // 修正后的比较器:提取文件路径字符串后,采用不区分大小写的比较逻辑 Comparator<Pair<IContributionItem, String>> filePathComparator = Comparator.comparing(Pair<IContributionItem, String>::getPathToFile, String.CASE_INSENSITIVE_ORDER); itemsList = itemsList.stream().sorted(filePathComparator).collect(Collectors.toList());
如果你的业务场景中可能出现空路径字符串,为避免空指针异常,可以添加空值优先处理的逻辑:
Comparator<Pair<IContributionItem, String>> filePathComparator = Comparator.comparing(Pair<IContributionItem, String>::getPathToFile, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER));
这样修改后,就能实现不区分大小写的自然字母顺序排序了。
内容的提问来源于stack exchange,提问作者MELS
相关产品推荐
相关产品推荐

