2016-11-25 105 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)]