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