Kotlin短路图{} firstOrNull {}

我需要映射一个列表并检索第一个非null元素,我需要将映射操作短路,就像在Java 8流API中应该一样。 在没有Java 8流的情况下,Kotlin有没有现成的方法?

我创建了自己的扩展方法来做到这一点:

fun <T, R> Iterable<T>.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 } 

问题是这将映射迭代器的所有元素,并且对于我的用例来说,在第一个非null元素处停下来是很重要的。

Kotlin懒惰地评估了对应于Java 8流的序列 ,而不是在集合上调用stream() ,而是调用asSequence()

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

我不知道什么是更快,@ ingoKegel的解决方案,或者:

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