Есть еще один способ, если ваш массив имеет тип char []:
char A[] = {'a', 'b', 'c'};
System.out.println(A); // no other arguments
abc
Либо используется для возврата одного из двух возможных значимых результатов, в отличие от Option, которое используется для возврата одного значимого результата или ничего.
Простой для понимания пример приведен ниже (распространен на список рассылки Scala некоторое время назад):
def throwableToLeft[T](block: => T): Either[java.lang.Throwable, T] =
try {
Right(block)
} catch {
case ex => Left(ex)
}
Как следует из названия функции, если выполнение «блока» прошло успешно, она вернет «Право (<результат>)». В противном случае, если брошен Throwable, он вернет «Left (
var s = "hello"
throwableToLeft { s.toUpperCase } match {
case Right(s) => println(s)
case Left(e) => e.printStackTrace
}
// prints "HELLO"
s = null
throwableToLeft { s.toUpperCase } match {
case Right(s) => println(s)
case Left(e) => e.printStackTrace
}
// prints NullPointerException stack trace
Надеюсь, что это поможет.
Приведенный вами фрагмент кажется очень надуманным. Вы используете Either в ситуации, когда:
Преобразование исключения в Left действительно, распространенный вариант использования. По сравнению с try / catch он имеет преимущество в том, что код хранится вместе, что имеет смысл, если исключение составляет ожидаемый результат . Наиболее распространенный способ обработки Either - это сопоставление с образцом:
result match {
case Right(res) => ...
case Left(res) => ...
}
Другой интересный способ обработки Either
- когда он появляется в коллекции. При создании карты для коллекции генерация исключения может оказаться нежизнеспособной, и вы можете захотеть вернуть некоторую информацию, кроме «невозможно». Использование Either позволяет сделать это, не перегружая алгоритм:
val list = (
library
\\ "books"
map (book =>
if (book \ "author" isEmpty)
Left(book)
else
Right((book \ "author" toList) map (_ text))
)
)
Здесь мы получаем список всех авторов в библиотеке, плюс список книг без автора. Итак, мы можем затем обработать его соответствующим образом:
val authorCount = (
(Map[String,Int]() /: (list filter (_ isRight) map (_.right.get)))
((map, author) => map + (author -> (map.getOrElse(author, 0) + 1)))
toList
)
val problemBooks = list flatMap (_.left.toSeq) // thanks to Azarov for this variation
Итак, базовое использование Either выглядит следующим образом. Это не особенно полезный класс, но если бы он был, вы бы видели его раньше. С другой стороны, это тоже не бесполезно.