2016-11-25 100 views
14

什么是Kotlin通过空值字段排序对象列表的方式,最后是空值?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; 
} 

回答

10

你可以使用kotlin.comparisons的这些功能包:

这将让你通过nullableField做出比较SomeObject比较投入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)] 
8

您可以使用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)]