我有界面A
和课程B: A
val a: Stream<A>
val b: Stream<B> = a.filter { it is B }
.map { it as B }
有没有办法用Kotlin智能演员来写这个?
答案 0 :(得分:2)
有没有办法用Kotlin智能演员来写这个?
不,这是不可能的基本静态分析,因为没有指示a
,在被过滤后,只包含B
,因为它仍然是Stream<A>
,所以你必须自己检查一下。 Kotlin的智能投射仅适用于变量的值,而不适用于类型参数。
AFAIK在Stream
的Java或Kotlin库中没有任何功能,但你可以convert the stream to a Sequence
使用filterIsInstance
:
a.asSequence().filterIsInstance<B>().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>()
只是评论:你需要使用Stream
吗?我会考虑从一开始就使用Kotlin的Sequence
。