что не так с типом в коде ниже, как определить тип для O - PullRequest
0 голосов
/ 06 октября 2018

проблема с типом в приведенном ниже коде, как определить тип для o, если я удаляю instanceof, то он возвращает что-либо еще, как выполнить приведение типа?

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 голосов
/ 06 октября 2018

BasicDBList#parallelStream() возвращает java.util.stream.Stream<E>, которое вы можете превратить в scala.Stream, чтобы функция вашей карты приняла частичную функцию.

Вы можете использовать scala-java8-compat для поворотаjava.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.toList или Stream.toArray.

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