sorting - query - Kotlin clasificando nulos al final
spring boot url parameter (2)
Puede usar estas funciones del paquete kotlin.comparisons
:
fun <T: Comparable<T>> nullsLast(): Comparator<T?>
, que construye un comparador de algo comparable que solo ponenull
s después de todos los valores no nulos;fun <T, K> compareBy(comparator: Comparator<in K>, selector: (T) -> K): Comparator<T>
, que acepta un comparador y una función que proporciona valores para el comparador, combinándolos en un nuevo comparador
Esto le permitirá hacer un comparador que compare SomeObject
por SomeObject
poniendo null
s en último lugar. Entonces simplemente puede pasar el comparador a
fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T>
, que clasifica un iterable en una lista usando un comparador:
val l = listOf(SomeObject(null), SomeObject("a"))
l.sortedWith(compareBy(nullsLast<String>()) { it.nullableField }))
// [SomeObject(nullableField=a), SomeObject(nullableField=null)]
¿Cuál sería una forma Kotlin de ordenar la lista de objetos por campo nulo con nulos en último lugar?
Kotlin objeto de ordenar:
@JsonInclude(NON_NULL)
data class SomeObject(
val nullableField: String?
)
Análogo al código de Java a continuación:
@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;
}
Puedes usar compareBy
y pasar nullsLast
como comparador así:
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)]