【发布时间】:2017-10-06 16:24:54
【问题描述】:
我在使用 Java 8 Comparator 类对项目列表进行排序时遇到问题。
我目前的工作比较器如下:
comparator = Comparator.comparing(Person::getName, Comparator.nullsFirst(Comparator.naturalOrder()));
这很有效:它首先使用空值按名称对列表进行排序。但是,我现在尝试忽略名称的大小写。
我知道我可以编写一个新的 getter 来返回全小写的名称,但我不想采用这种方法,因为我必须为多个属性执行此操作。
在网上看,我应该使用String.CASE_INSENSITIVE_ORDER,但我看到的唯一示例不包括空排序规范。
我可以这样做:
comparator = Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER);
但是,每当我尝试包含 Comparator.nullsFirst 时,我最终都会遇到类型错误,并且对如何继续感到困惑。
我试过做一个类似于
的链thenComparing(Comparator.nullsFirst(Comparator.naturalOrder))
但这也行不通。
有人可以给我一些建议,告诉我如何将它们链接在一起以按名称排序(不区分大小写),然后对空值进行排序。我似乎对这些类型感到困惑。
【问题讨论】:
-
您可以非常轻松地编写自己的
Comparator,而不是使用罐头。罐装的适用于最常见的用例,显然不适用于您。 -
你不能像使用
Comparator.naturalOrder()一样将String.CASE_INSENSITIVE_ORDER包裹在Comparator.nullsFirst(...)中吗? -
如果您正在制作自定义比较器 BTW,为什么要使用
naturalOrder? -
@MadPhysicist 我不想制作自己的比较器,因为我需要对许多不同对象的许多不同属性进行相同的排序。我宁愿有一行代码,我可以改变每个的属性。
-
@Bubletan 看起来成功了!谢谢
标签: java comparator