代码之家  ›  专栏  ›  技术社区  ›  Jas

couchbase scala observate n1ql查询结果,缺少扩展函数的参数类型((x$12)=>x$12.rows())

  •  0
  • Jas  · 技术社区  · 7 年前

    我尝试使用couchbase异步bucket n1ql查询,如下所示:

    下面有一个可以运行的非编译代码示例:(注意,我必须使用scala:2.11.7)

    https://scastie.scala-lang.org/nkWOuCOrRbKbzieEK2D8yA

    couchbaseBucket.async().query(N1qlQuery.simple(s"SELECT META(${couchbaseBucket.name()}).id FROM diy WHERE META(${couchbaseBucket.name()}).id LIKE MyKeysPrefix%;"))
      .flatMap(_.rows()) // missing parameter type for expanded function ((x$12) => x$12.rows())
      .map(result => result.asInstanceOf[AsyncN1qlQueryRow].value().toMap)
      .toList
      .timeout(10, TimeUnit.SECONDS)
      .toBlocking
      .single()
    

    我排在后面: .flatMap(_.rows())

    扩展函数缺少参数类型((x$12)=>x$12.rows())

    我试着把它更新成:

    .flatMap(rows => rows.rows())

    然后我得到:

    缺少参数类型

    所以我试着更新到:

    .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())

    然后我得到:

    重载的方法值flatmap和替代项:

    overloaded method value flatMap with alternatives:
    [error]   [U, R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: U]], x$2: rx.functions.Func2[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ >: U, _ <: R], x$3: Int)rx.Observable[R] <and>
    [error]   [U, R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: U]], x$2: rx.functions.Func2[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ >: U, _ <: R])rx.Observable[R] <and>
    [error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]], x$2: rx.functions.Func1[_ >: Throwable, _ <: rx.Observable[_ <: R]], x$3: rx.functions.Func0[_ <: rx.Observable[_ <: R]], x$4: Int)rx.Observable[R] <and>
    [error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]], x$2: rx.functions.Func1[_ >: Throwable, _ <: rx.Observable[_ <: R]], x$3: rx.functions.Func0[_ <: rx.Observable[_ <: R]])rx.Observable[R] <and>
    [error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]], x$2: Int)rx.Observable[R] <and>
    [error]   [R](x$1: rx.functions.Func1[_ >: com.couchbase.client.java.query.AsyncN1qlQueryResult, _ <: rx.Observable[_ <: R]])rx.Observable[R]
    [error]  cannot be applied to (com.couchbase.client.java.query.AsyncN1qlQueryResult => rx.Observable[com.couchbase.client.java.query.AsyncN1qlQueryRow])
    [error]       .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
    [error]        ^
    [error] one error found
    

    在这一点上,我被这个错误吓坏了,我不知道该如何解决它…我该怎么修?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dmytro Mitin    7 年前

    尝试

    new MockCouchbaseServer()
      .createClient().async()
      .query(N1qlQuery.simple("SELECT META(somebucket).id FROM diy WHERE META(somebucket).id LIKE MyKeyPrefix%;"))
      .flatMap(new rx.functions.Func1[AsyncN1qlQueryResult, rx.Observable[AsyncN1qlQueryRow]] {
        override def call(rows: AsyncN1qlQueryResult): rx.Observable[AsyncN1qlQueryRow] = rows.rows()
      })
      .map[java.util.Map[String, Object]](new rx.functions.Func1[AsyncN1qlQueryRow, java.util.Map[String, Object]] {
        override def call(result: AsyncN1qlQueryRow): util.Map[String, Object] = result.value().toMap
      })
      .toList
      .timeout(10, TimeUnit.SECONDS)
      .toBlocking
      .single()
    

    这段代码与scastie的导入一起编译,如下所示 build.sbt :

    scalaVersion := "2.11.7"
    
    libraryDependencies += "com.couchbase.client" % "java-client" % "2.5.8"
    libraryDependencies += "com.couchbase.mock" % "CouchbaseMock" % "1.5.19"
    

    或者,您可以手动定义隐式转换,这简化了代码:

    implicit def convert[T, R](f: T => R): rx.functions.Func1[T, R] = (t: T) => f(t)
    
    def main(args: Array[String]): Unit = {
      new MockCouchbaseServer()
        .createClient().async()
        .query(N1qlQuery.simple("SELECT META(somebucket).id FROM diy WHERE META(somebucket).id LIKE MyKeyPrefix%;"))
        .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
        .map[java.util.Map[String, Object]]((result: AsyncN1qlQueryRow) => result.value().toMap)
        .toList
        .timeout(10, TimeUnit.SECONDS)
        .toBlocking
        .single()
    }
    

    在scala 2.12中,可以写:

    new MockCouchbaseServer()
      .createClient().async()
      .query(N1qlQuery.simple("SELECT META(somebucket).id FROM diy WHERE META(somebucket).id LIKE MyKeyPrefix%;"))
      .flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
      .map[java.util.Map[String, Object]](result => result.asInstanceOf[AsyncN1qlQueryRow].value().toMap)
      .toList
      .timeout(10, TimeUnit.SECONDS)
      .toBlocking
      .single()