在Scala和Flatmap中使用RxJava

时间:2019-04-16 21:01:29

标签: java scala observable rx-java

我正在尝试在Scala应用中使用RX Java并行执行多个请求

在Java中成功运行的代码是

List<rx.Observable<Response<MyObject>>> observables = requests.stream().map(
    request -> client.getResponse(request).collect(Collectors.toList());

Observable<MyObject> mergedObservable = Observable.merge(observables)
    .flatMap(page -> {
        List<MyObject> objects = page.getResults();
        Observable<MyObject> objectsObservable =  Observable.from(objects);
        return objectsObservable;
}).toBlocking().getIterator()

我想在Scala中编写与该代码段等效的代码,

val observables: Array[Observable[Response[MyObject]]] = requests.map(request => client.getResponse(request));
Observable.merge(observables.toList)
       .flatMap[Observable[MyObject]]((page: Response[MyObject]) => {
       val resutls: java.util.List[MyObject] = page.getResults
       val resultObservable: Observable[MyObject] = Observable.from(resutls)
       resultObservable
    }).toBlocking
      .getIterator

代码因异常而失败

 overloaded method value flatMap with alternatives:
  (x$1: rx.functions.Func1[_ >: com.mypackage.Response[com.mypackage.MyObject], _ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]],x$2: rx.functions.Func1[_ >: Throwable, _ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]],x$3: rx.functions.Func0[_ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]],x$4: Int)rx.Observable[rx.Observable[com.mypackage.MyObject]] <and>
  (x$1: rx.functions.Func1[_ >: com.mypackage.Response[com.mypackage.MyObject], _ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]],x$2: rx.functions.Func1[_ >: Throwable, _ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]],x$3: rx.functions.Func0[_ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]])rx.Observable[rx.Observable[com.mypackage.MyObject]] <and>
  (x$1: rx.functions.Func1[_ >: com.mypackage.Response[com.mypackage.MyObject], _ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]],x$2: Int)rx.Observable[rx.Observable[com.mypackage.MyObject]] <and>
  (x$1: rx.functions.Func1[_ >: com.mypackage.Response[com.mypackage.MyObject], _ <: rx.Observable[_ <: rx.Observable[com.mypackage.MyObject]]])rx.Observable[rx.Observable[com.mypackage.MyObject]]
 cannot be applied to (com.mypackage.Response[com.mypackage.MyObject] => rx.Observable[com.mypackage.MyObject])

关于如何更改Scala代码来避免这种情况的任何想法?

2 个答案:

答案 0 :(得分:2)

如果仔细阅读,该错误所表示的是,由于Func1[Response[MyObject], Observable[Observable[MyObject]]]上的类型参数,它期望看到类似flatMap的内容。删除它或将其更改为正确的flatMap[MyObject]可能足以解决问题(假设您使用的是-Xexperimental在Scala 2.12或Scala 2.11上;否则,您不能将lambda直接用于{{1 }},并且需要一个辅助函数。

如果不是,我只需提取lambda并为其指定所需的类型(仍假定为Scala 2.12):

Func

您也可以内联:

val f: Func1[Response[MyObject], Observable[MyObject]] = 
  page => Observable.from(page.getResults)

Observable.merge(observables.toList).flatMap(f).toBlocking.getIterator

答案 1 :(得分:0)

我想我可以帮忙,但也许可以。有一次我遇到类似的问题,原因是scala首先使用scala.function而不是java.fucntion,因此lambda不兼容。我不会保证这会起作用,但是会使用内部类代替lambda的类。