невозможно преобразовать java.util.Список в список Scala

#scala #scala-java-interop

#scala #scala-java-interop

Вопрос:

Я хочу, чтобы if блок возвращался Right(List[PracticeQuestionTags]) , но я не могу этого сделать. Возвращает if/else Either

 //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)}
  

Комментарии:

1.Вы возвращаетесь Right и Left которые являются экземплярами Either . С этим кодом много проблем, возможно, вы просто захотите использовать asScala docs.scala-lang.org/overviews/collections-2.13 /…

2. извините, исправлено, if должно вернуться Right , else должно вернуться Left

Ответ №1:

Измените 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)
  

Ответ №2:

Ваш finalList: List[PracticeQuestionTag] = List() immutable список scala. Таким образом, вы не можете его изменить, что означает, что нет способа добавить, удалить или внести изменения в этот список.

Один из способов добиться этого — использовать функциональный подход scala. Другой использует a mutable list , затем добавляет к нему, и этот список может быть конечным значением if выражения.

Кроме того, while выражение всегда вычисляется Unit , оно никогда не будет иметь никакого значения. Вы можете использовать while для создания своего ответа, а затем возвращать его отдельно.

 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)
}