我在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))
答案 0 :(得分:0)
java.lang.Integer
和Int
是不同的类型,但它们可以相互转换。使用
val o = Observable.from(List[java.lang.Integer](1, 2, 3, 4, 5, 6))
或
val predicate = new Func1[Int, java.lang.Boolean] ...
第一个肯定应该有效,第二个可能没有用(使用Java定义的泛型有问题,类型参数扩展AnyVal
,如Int
)。