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> ,它接受一个比较器和一个为比较器提供值的函数,将它们组合成一个新的比较;

这会让你创建一个比较器来比较SomeObjectnullableField ,最后放置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)]