当前位置:  开发笔记 > 编程语言 > 正文

Kotlin短路图{} .firstOrNull {}

如何解决《Kotlin短路图{}.firstOrNull{}》经验,为你挑选了1个好方法。

我需要映射一个列表并检索第一个非null元素,我需要将map操作短路,就像它应该在Java 8流API中一样.有没有Java 8流可以在Kotlin中做到这一点?

我创建了自己的扩展方法来执行此操作:

fun  Iterable.firstNonNullMapping(transform: (T) -> R?): R? {
    for (element in this) {
        val result = transform(element)
        if (result != null) {
            return result
        }
    }
    return null
}

测试证明这是有效的

val firstNonNullMapping = listOf(null, 'a', 'b')
        .firstNonNullMapping {
            assertNotEquals(it, 'b') // Mapping should be stopped before reaching 'b'
            it
        }
assertEquals(firstNonNullMapping, 'a')

但是,IntelliJ建议我用更整洁的东西替换我的for循环

return this
        .map { transform(it) }
        .firstOrNull { it != null }

问题是这将映射iterable的所有元素,并且对于我的第一个非null元素停止的用例是必不可少的.



1> Ingo Kegel..:

Kotlin懒惰地评估了与Java 8流相对应的序列,而不是调用stream()集合,您调用asSequence():

return this
        .asSequence()
        .map { transform(it) }
        .firstOrNull { it != null }


`.firstOrNull {it!= null}`与`firstOrNull()`不同.第一个将返回第一个非null元素,如果序列为空,则返回null.后者将返回第一个元素,无论它是否为null(如果它为空,则返回null).
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有