Kotlin最后排序为空
什么是一个Kotlin的方式来排序空对象的列表与null为空最后?
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; }
您可以使用kotlin.comparisons
包中的这些函数:
-
fun <T: Comparable<T>> nullsLast(): Comparator<T?>
,它构造了一个可比较的比较器,只是在所有非空值之后放置null
; -
fun <T, K> compareBy(comparator: Comparator<in K>, selector: (T) -> K): Comparator<T>
,它接受一个比较器和一个为比较器提供值的函数,将它们组合成一个新的比较;
这会让你创建一个比较器来比较SomeObject
的nullableField
,最后放置null
。 然后你可以简单地通过比较器
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)]
您可以使用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)]