我在 RxScala 应用程序中使用来自 Kafka 的消息,并希望在动态大小的滑动窗口中处理消息,即我想对在同一 2 秒内创建的所有消息进行分组。据我所知,RxScala 不提供这种运算符。这个存储库 ( https://github.com/davidmoten/rxjava-extras ) 确实提供了一个“toListWhile”函数,但采用 Java 代码的形式。
调用所需函数的简化尝试失败:
import com.github.davidmoten.rx.Transformers
import rx.functions.Func1
import rx.lang.scala.JavaConversions._
import rx.lang.scala.Observable
val o = Observable.from(List(1, 2, 3, 4, 5, 6))
val predicate = new Func1[java.lang.Integer, java.lang.Boolean] {
override def call(t: Integer): Boolean = true
}
val p = o.compose(Transformers.toListWhile(predicate))
这是我得到的错误:
Error:(75, 45) type mismatch;
found : rx.functions.Func1[Integer,Boolean]
required: rx.functions.Func1[_ >: _$7, Boolean] where type _$7 <: Int
Note: Integer <: Any, but Java-defined trait Func1 is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
val p = o.compose(Transformers.toListWhile(predicate))
^
有人可以帮我从 Scala 调用该代码吗?谢谢!
解决方案
import java.lang.Boolean
import com.github.davidmoten.rx.Transformers
import rx.functions.Func1
import rx.lang.scala.JavaConversions._
import rx.lang.scala.Observable
val o = Observable.from(List[java.lang.Integer](1, 2, 3, 4, 5, 6))
val predicate = new Func1[java.lang.Integer, java.lang.Boolean] {
override def call(t: Integer): Boolean = true
}
val p = o.compose[java.util.List[java.lang.Integer]](Transformers.toListWhile(predicate))