2016-11-25 20 views
14

Jaki byłby sposób Kotlin sortowania listy obiektów według pola zerowego z wartościami zerowymi jako ostatnim?Sortowanie kotlin zerowe ostatni

Kotlin obiektu do rodzaju:

@JsonInclude(NON_NULL) 
data class SomeObject(
    val nullableField: String? 
) 

analogowe poniżej kodu 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; 
} 

Odpowiedz

10

You mogą korzystać z tych funkcji z poziomu kotlin.comparisons Pakiet:

To pozwoli Ci dokonać komparator porównujący SomeObject przez nullableField oddanie null s ostatni. Następnie możesz po prostu przekazać komparator do
fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T>, który sortuje listę do porównania za pomocą komparatora:

val l = listOf(SomeObject(null), SomeObject("a")) 

l.sortedWith(compareBy(nullsLast<String>()) { it.nullableField })) 
// [SomeObject(nullableField=a), SomeObject(nullableField=null)] 
8

Można użyć compareBy i przekazać nullsLast jako komparator tak:

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)]