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>()