Kotlin 科特林智能铸造与流
我有接口Kotlin 科特林智能铸造与流,kotlin,Kotlin,我有接口A和类B:A val a: Stream<A> val b: Stream<B> = a.filter { it is B } .map { it as B } vala:Stream valb:Stream=a.filter{它是b} .map{it as B} 有没有一种方法可以使用Kotlin smart casts编写此代码 有没有一种方法可以使用Kotlin smart casts编写此代码 不,这在基本静态
A
和类B:A
val a: Stream<A>
val b: Stream<B> = a.filter { it is B }
.map { it as B }
vala:Stream
valb:Stream=a.filter{它是b}
.map{it as B}
有没有一种方法可以使用Kotlin smart casts编写此代码
有没有一种方法可以使用Kotlin smart casts编写此代码
不,这在基本静态分析中是不可能的,因为没有指标表明a
,经过过滤后,只包含B
s,因为它仍然是流,并且使用:
a.asSequence().filterIsInstance().asStream()
当然,您也可以使用扩展方法直接在流上实现此功能:
inline fun <reified B> Stream<*>.filterIsInstance() = a.filter { it is B }.map { it as B }
...
val a: Stream<A>
val b: Stream<B> = a.filterIsInstance<B>()
inline fun Stream.filterIsInstance()=a.filter{it is B}.map{it as B}
...
瓦拉:小溪
val b:Stream=a.filterIsInstance()
只是一个注释:您需要使用Stream
s吗?我会考虑从一开始就使用KOTLIN <代码>序列<代码> s。我在项目的这一部分中有一个迭代。所以,传入流是一个must@SergeyRybalkin好的,我想扩展方法是更好的方法,因为它涉及更少的转换
inline fun <reified B> Stream<*>.filterIsInstance() = a.filter { it is B }.map { it as B }
...
val a: Stream<A>
val b: Stream<B> = a.filterIsInstance<B>()