尝试使用 Comparator 按名称排序、忽略大小写以及先处理空值

2024-04-24

我在使用 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))

但这也行不通。

有人可以给我一些建议,告诉我如何将它们链接在一起以按名称排序(不区分大小写),然后对空值进行排序。我似乎对这些类型感到困惑。


有两种类型null您可以将其添加到您的列表中。你可以有null Person参考资料,你可以有Persons with null names.

在第一种情况下,您必须申请nullsFirst https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#nullsFirst-java.util.Comparator-到您要使用的基本比较器:

comparator = Comparator.nullsFirst(
        Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER));

如果你有机会null名称,您需要确保您的密钥永远不会返回null,或者您申请nullsFirst to String.CASE_INSENSITIVE_ORDER https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#CASE_INSENSITIVE_ORDER。第二种选择当然要容易得多:

comparator = Comparator.comparing(
        Person::getName, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER));

如果您有两个选择(null参考and null名称),您必须合并两个版本并应用nullsFirst twice:

comparator = Comparator.nullsFirst(
        Comparator.comparing(
                Person::getName,
                Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)
        )
);

如果您像这样链接多个比较,则外部nullsFirst,这确保了null Persons 得到正确排序,可以应用于整个链:

comparator = Comparator.nullsFirst(
        Comparator.comparing(
                Person::getName,
                Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)
        ).thenComparing(...)
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试使用 Comparator 按名称排序、忽略大小写以及先处理空值 的相关文章

随机推荐