在RxScala应用程序中调用Java库(rxjava-extras)代码

时间:2017-03-27 16:55:20

标签: java scala rx-java scala-java-interop rx-scala

我在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))

1 个答案:

答案 0 :(得分:0)

java.lang.IntegerInt是不同的类型,但它们可以相互转换。使用

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