2016-11-25 14 views
14

Điều gì sẽ là một cách Kotlin sắp xếp danh sách các đối tượng bằng trường nullable với nulls cuối cùng?Kotlin sắp xếp nulls cuối cùng

Kotlin đối tượng để sắp xếp:

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

Analogue xuống dưới mã 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; 
} 

Trả lời

10

Bạn có thể sử dụng các chức năng này từ kotlin.comparisons gói:

này sẽ cho phép bạn thực hiện một so sánh mà so sánh SomeObject bởi nullableField đặt null s ngoái. Sau đó, bạn có thể chỉ cần chuyển bộ so sánh đến
fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T>, sắp xếp một danh sách lặp lại thành danh sách bằng cách sử dụng bộ so sánh:

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

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

Bạn có thể sử dụng compareBy và vượt qua nullsLast như so sánh như vậy:

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)] 
Các vấn đề liên quan