Search code examples
sortingkotlin

Kotlin sorting nulls last


What would be a Kotlin way of sorting list of objects by nullable field with nulls last?

Kotlin object to sort:

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

Analogue to below Java code:

@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;
}

Solution

  • You can use these functions from the kotlin.comparisons package:

    This will let you make a comparator that compares SomeObject by nullableField putting nulls last. Then you can simply pass the comparator to
    fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T>, which sorts an iterable into a list using a comparator:

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