Как мне обрабатывать возвращено Либо если функция scala def A(): Either[Exception, ArrayBuffer[Int]] = { ... } Каким должен быть правильный способ обработки возвращаемого результата? val a = A() и? Ответ 1 Обычно я предпочитаю использовать fold. Вы можете использовать его как карту: scala> def a: Either[Exception,String] = Right("On") a.fold(l => Left(l), r => Right(r.length)) res0: Product with Either[Exception,Int] = Right(2) Или вы можете использовать его, как совпадение с шаблоном: scala> a.fold( l => { | println("This was bad") | }, r => { | println("Hurray! " + r) | }) Hurray! On Или вы можете использовать его как getOrElse в Option: scala> a.fold( l => "Default" , r => r ) res2: String = On Ответ 2 Самый простой способ - сопоставление с образцом val a = A() a match{ case Left(exception) => // do something with the exception case Right(arrayBuffer) => // do something with the arrayBuffer } В качестве альтернативы существует множество довольно простых методов для Либо, которые могут использоваться для задания. Здесь scaladoc http://www.scala-lang.org/api/current/index.html#scala.Either Ответ 3 Один из способов - val a = A(); for (x <- a.left) { println("left: " + x) } for (x <- a.right) { println("right: " + x) } Фактически будет оценено только одно из тел выражений for.
Ответ 1 Обычно я предпочитаю использовать fold. Вы можете использовать его как карту: scala> def a: Either[Exception,String] = Right("On") a.fold(l => Left(l), r => Right(r.length)) res0: Product with Either[Exception,Int] = Right(2) Или вы можете использовать его, как совпадение с шаблоном: scala> a.fold( l => { | println("This was bad") | }, r => { | println("Hurray! " + r) | }) Hurray! On Или вы можете использовать его как getOrElse в Option: scala> a.fold( l => "Default" , r => r ) res2: String = On
Ответ 2 Самый простой способ - сопоставление с образцом val a = A() a match{ case Left(exception) => // do something with the exception case Right(arrayBuffer) => // do something with the arrayBuffer } В качестве альтернативы существует множество довольно простых методов для Либо, которые могут использоваться для задания. Здесь scaladoc http://www.scala-lang.org/api/current/index.html#scala.Either
Ответ 3 Один из способов - val a = A(); for (x <- a.left) { println("left: " + x) } for (x <- a.right) { println("right: " + x) } Фактически будет оценено только одно из тел выражений for.