Kotlin排序为空

Ale*_*lex 27 sorting kotlin

什么是Kotlin排序对象列表的可空字段与空值最后?

Kotlin对象排序:

@JsonInclude(NON_NULL)
data class SomeObject(
    val nullableField: String?
)
Run Code Online (Sandbox Code Playgroud)

类似于以下Java代码:

@Test
public void name() {
    List<SomeObject> sorted = Stream.of(new SomeObject("bbb"), new SomeObject(null), new SomeObject("aaa"))
            .sorted(Comparator.comparing(SomeObject::getNullableField, Comparator.nullsLast(Comparator.naturalOrder())))
            .collect(toList());

    assertEquals("aaa", sorted.get(0).getNullableField());
    assertNull(sorted.get(2).getNullableField());
}

@Getter
@AllArgsConstructor
private static class SomeObject {
    private String nullableField;
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 23

您可以使用kotlin.comparisons包中的这些功能:

这将让你做出比较的比较SomeObject通过nullableFieldnull的最后一个.然后你可以简单地将比较器传递给
fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T>,使用比较器将一个iterable分类到一个列表中:

val l = listOf(SomeObject(null), SomeObject("a"))

l.sortedWith(compareBy(nullsLast<String>()) { it.nullableField }))
// [SomeObject(nullableField=a), SomeObject(nullableField=null)]
Run Code Online (Sandbox Code Playgroud)

  • 这里的一个小补充,当比较降序时:`compareByDescending(nullsLast&lt;String&gt;(), { it.nullableField })`实际上会对第一个位置的空值进行排序,所以也许它会更有意义,并且更清楚地编写像这样的代码:`sortedWith(nullsLast(compareBy { it.nullableField }))`或其补充:`sortedWith(nullsLast(compareByDescending { it.nullableField }))`。 (5认同)

mie*_*sol 16

您可以像这样使用compareBy和传递nullsLast比较器:

val elements = listOf(SomeObject("bbb"), SomeObject(null), SomeObject("aaa"))

val sorted = elements.sortedWith(compareBy<SomeObject,String?>(nullsLast(), { it.name }))

println(sorted) //-> [SomeObject(name=aaa), SomeObject(name=bbb), SomeObject(name=null)]
Run Code Online (Sandbox Code Playgroud)