sorting - Kotlin 最后排序空值

什么是 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;
}

最佳答案

您可以使用 kotlin.comparisons 中的这些功能包装:

  • fun <T: Comparable<T>> nullsLast(): Comparator<T?> ,它构造了一个可比较的比较器,它只放置 null s 毕竟不是空值;

  • fun <T, K> compareBy(comparator: Comparator<in K>, selector: (T) -> K): Comparator<T> ,它接受一个比较器和一个为比较器提供值的函数,将它们组合成一个新的比较器;

这将让您创建一个比较 SomeObject 的比较器由 nullableFieldnull最后。然后你可以简单地将比较器传递给
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)]

https://stackoverflow.com/questions/40802047/

相关文章:

android - 延迟对 Kotlin 协程进行单元测试

android - 应用程序模块中引用的 android 库模块的“ Unresolved 引用”错

android - 将 LiveData 与数据绑定(bind)一起使用

java - 如何在 Kotlin 中初始化一个线程?

kotlin - 在 Kotlin 中对可空整数使用 "greater than"、 "less t

android - 如何混淆我用 kotlin 编码的 sdk(并摆脱元数据)

kotlin - 有什么作用?。在作业的左侧使用时在 Kotlin 中的意思是什么?

android - 为全屏 Activity 摆脱不必要的根布局

android - kotlin 'onCreate' 不会覆盖任何内容

java - 错误 :Kotlin: Unsupported plugin option: org.