Kotlin智能投射与Stream

时间:2018-02-14 13:48:42

标签: kotlin

我有界面A和课程B: A

val a: Stream<A>

val b: Stream<B> = a.filter { it is B }
                    .map { it as B }

有没有办法用Kotlin智能演员来写这个?

1 个答案:

答案 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