Котлинская сортировка нулей

Каким будет метод сортировки списка объектов по методу Котлина с нулевым полем с нулями?

Объект Kotlin для сортировки:

@JsonInclude(NON_NULL)
data class SomeObject(
    val nullableField: String?
)

Аналог ниже кода 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;
}

Ответы

Ответ 1

Вы можете использовать эти функции из пакета kotlin.comparisons:

Это позволит вам сделать компаратор, который сравнивает SomeObject с nullableField, помещая null last. Затем вы можете просто передать компаратор в fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T>, который сортирует итерабельность в списке с помощью компаратора:

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

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

Ответ 2

Вы можете использовать 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)]