无法将 java.util.List 转换为 Scala 列表

unable to convert a java.util.List into Scala list

我想要 if 阻止 returns Right(List[PracticeQuestionTags]) 但我做不到。 if/elsereturnsEither

//I get java.util.List[Result]

val resultList:java.util.List[Result] = transaction.scan(scan);

if(resultList.isEmpty == false){

  val listIterator = resultList.listIterator()
  val finalList:List[PracticeQuestionTag] = List()
  //this returns Unit. How do I make it return List[PracticeQuestionTags]
 val answer = while(listIterator.hasNext){
    val result = listIterator.next()
    val convertedResult:PracticeQuestionTag = rowToModel(result) //rowToModel takes Result and converts it into PracticeQuestionTag
    finalList ++ List(convertedResult) //Add to List. I assumed that the while will return List[PracticeQuestionTag] because it is the last statement of the block but the while returns Unit
  }
  Right(answer) //answer is Unit, The block is returning Right[Nothing,Unit] :(

} else {Left(Error)}

您的 finalList: List[PracticeQuestionTag] = List()immutable scala 列表。所以您无法更改它,这意味着无法添加、删除或更改此列表。

实现此目的的一种方法是使用 Scala 函数式方法。另一个是使用 mutable list,然后添加到该列表,该列表可以是 if 表达式的最终值。

此外,while 表达式的计算结果始终为 Unit,它永远不会有任何值。您可以使用 while 创建您的答案,然后 return 单独创建它。

val resultList: java.util.List[Result] = transaction.scan(scan)

if (resultList.isEmpty) {
  Left(Error)
}
else {
  val listIterator = resultList.listIterator()

  val listBuffer: scala.collection.mutable.ListBuffer[PracticeQuestionTag] = 
    scala.collection.mutable.ListBuffer()

  while (listIterator.hasNext) {
    val result = listIterator.next()

    val convertedResult: PracticeQuestionTag = rowToModel(result)

    listBuffer.append(convertedResult)
  }

  Right(listBuffer.toList)
}

尽快将 java.util.List 列表更改为 Scala List。然后你可以用 Scala 的方式处理它。

import scala.jdk.CollectionConverters._

val resultList = transaction.scan(scan).asScala.toList

Either.cond( resultList.nonEmpty
           , resultList.map(rowToModel(_))
           , new Error)