下面的代码中的类型有什么问题如何为o定义类型

时间:2018-10-06 18:09:30

标签: mongodb scala

下面的代码中的

type问题,如果我删除instanceof,则如何为o定义类型,则它返回anyref,那么如何进行铸造呢?

def toList(dbObj: BasicDBList): Array[MaxMinValues] = {
 dbObj.parallelStream().map { o =>
  //print(o)
  MaxMinValues(
    o.asInstanceOf[BasicDBObject].get(Constants.maxCitationCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.minCitationCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.maxSearchCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.minSearchCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.maxReanalysisCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.minReanalysisCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.maxViewCount).asInstanceOf[Int],
    o.asInstanceOf[BasicDBObject].get(Constants.minViewCount).asInstanceOf[Int]
  )
 }.asInstanceOf[Array[MaxMinValues]]
}

1 个答案:

答案 0 :(得分:2)

BasicDBList#parallelStream()返回java.util.stream.Stream<E>,您可以将其变成scala.Stream,以便您的map函数将采用部分函数。

您可以使用scala-java8-compatjava.Stream变成scala.Stream

libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.9.0"

然后您就可以将结果作为BasicDBObject进行一次模式匹配,而不必在每一行上强制转换。

示例

import com.mongodb.BasicDBList
import com.mongodb.BasicDBObject

val list = new BasicDBList

list.add(new BasicDBObject(
  "maxCitationCount", 1
))

list.add(new BasicDBObject(
  "maxCitationCount", 2
))

import scala.compat.java8.StreamConverters._

final case class MaxMin(max: Int)

def toList(dbObj: BasicDBList): Stream[MaxMin] = {
  dbObj.parallelStream().toScala[Stream].map {
    case (o: BasicDBObject) =>
      MaxMin(o.getInt("maxCitationCount"))
    //TODO handle default case
  }
}

val result = toList(list)
println(result) //Stream(MaxMin(1), ?)

如果要评估整个Stream,请执行Stream.toListStream.toArray

//evaluate stream
val result = toList(list).toList
println(result) // List(MaxMin(1), MaxMin(2))