我需要映射一个列表并检索第一个非null元素,我需要将map操作短路,就像它应该在Java 8流API中一样.有没有Java 8流可以在Kotlin中做到这一点?
我创建了自己的扩展方法来执行此操作:
funIterable .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元素停止的用例是必不可少的.
Kotlin懒惰地评估了与Java 8流相对应的序列,而不是调用stream()
集合,您调用asSequence()
:
return this .asSequence() .map { transform(it) } .firstOrNull { it != null }