Класс scala.util.Either
Компаньон объект Either
запечатанный абстрактный класс Either[+A, +B] extends Product с Serializable
Абстрактные члены
абстрактный def canEqual(that: Any): Boolean
Метод, который следует вызывать из каждого хорошо спроектированного метода equals, который можно переопределять в подклассе. См. Programming in Scala, Глава 28 для обсуждения и проектирования.
- that
значение, на возможность равенства с которым проверяется
- возвращает
true, если этот экземпляр потенциально может быть равен
that, в противном случае false
- Определения классов
- Equals
абстрактный def isLeft: Boolean
Возвращает true если это Left, false в противном случае.
Left("tulip").isLeft // true
Right("venus fly-trap").isLeft // false
абстрактный def isRight: Boolean
Возвращает true если это Right, false в противном случае.
Left("tulip").isRight // false
Right("venus fly-trap").isRight // true
абстрактный def productArity: Int
Размер этого произведения.
- возвращает
для произведения
A(x1, ..., xk), возвращаетk
- Определения классов
- Product
абстрактный def productElement(n: Int): Any
n-ый элемент этого произведения, нумерация с 0. Другими словами, для произведения A(x1, ..., xk), возвращает x(n+1) где 0 <= n < k.
- n
индекс элемента для возврата
- возвращает
элемент
nэлементов после первого элемента
- Определения классов
- Product
- Исключения
IndexOutOfBoundsExceptionеслиnнаходится вне допустимого диапазона (n < 0 || n >= productArity).
Члены конкретных значений
final def !=(arg0: Any): Boolean
Проверка двух объектов на неравенство.
- возвращает
trueесли !(this == that), в противном случае false.
- Определяющие классы
- AnyRef → Any
final def ##(): Int
Эквивалентно x.hashCode за исключением упакованных числовых типов и null. Для чисел он возвращает значение хэша, соответствующее равенству значений: если два экземпляра типа значения сравниваются как true, то ## создаст одинаковое значение хэша для каждого из них. Для null возвращает хэш-код, где null.hashCode выбрасывает NullPointerException.
- возвращает
значение хэша, соответствующее ==
- Определяющие классы
- AnyRef → Any
def +(other: String): String
- Неявный
- Этот член добавляется неявным преобразованием из Either[A, B] в any2stringadd[Either[A, B]] выполняемого методом any2stringadd в scala.Predef.
- Определяющие классы
- any2stringadd
def ->[B](y: B): (Either[A, B], B)
- Неявный
- Этот член добавляется неявным преобразованием из Either[A, B] в ArrowAssoc[Either[A, B]] выполняемого методом ArrowAssoc в scala.Predef.
- Определяющие классы
- ArrowAssoc
- Аннотации
- @inline()
final def ==(arg0: Any): Boolean
Выражение x == that эквивалентно if (x eq null) that eq null else x.equals(that).
- возвращает
trueесли объект-получатель эквивалентен аргументу;falseв противном случае.
- Определяющие классы
- AnyRef → Any
final def asInstanceOf[T0]: T0
Приведение объекта-получателя к типу T0.
Обратите внимание, что успех приведения в ходе выполнения зависит от семантики стирания Scala. Таким образом, выражение 1.asInstanceOf[String] выбросит ClassCastException во время выполнения, а выражение List(1).asInstanceOf[List[String]] — нет. В последнем примере, поскольку аргумент типа стирается во время компиляции, невозможно проверить, содержатся ли элементы списка в требуемом типе.
- возвращает
объект-получатель.
- Определяющие классы
- Any
- Исключения
ClassCastException, если объект-получатель не является экземпляром стирания типаT0.
def clone(): AnyRef
Создает копию объекта-получателя.
По умолчанию реализация метода clone зависит от платформы.
- возвращает
копию объекта-получателя.
final def contains[B1 >: B](elem: B1): Boolean
Возвращает true если это Right и его значение равно elem (определяется по ==), в противном случае возвращает false.
// Returns true because value of Right is "something" which equals "something".
Right("something") contains "something"
// Returns false because value of Right is "something" which does not equal "anything".
Right("something") contains "anything"
// Returns false because it's not a Right value.
Left("something") contains "something"
- elem
тестируемый элемент.
- возвращает
trueесли этоRightзначение, равноеelem.
def ensuring(cond: (Either[A, B]) => Boolean, msg: => Any): Either[A, B]
- Implicit
- Этот член добавляется неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]], выполняемым методом Ensuring в scala.Predef.
- Definition Classes
- Ensuring
def ensuring(cond: (Either[A, B]) => Boolean): Either[A, B]
- Implicit
- Этот член добавляется неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]], выполняемым методом Ensuring в scala.Predef.
- Definition Classes
- Ensuring
def ensuring(cond: Boolean, msg: => Any): Either[A, B]
- Implicit
- Этот член добавляется неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]], выполняемым методом Ensuring в scala.Predef.
- Definition Classes
- Ensuring
def ensuring(cond: Boolean): Either[A, B]
- Implicit
- Этот член добавляется неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]], выполняемым методом Ensuring в scala.Predef.
- Definition Classes
- Ensuring
final def eq(arg0: AnyRef): Boolean
Проверяет, является ли аргумент (that) ссылкой на принимающий объект (this).
Метод eq реализует отношение эквивалентности для не-нулевых экземпляров AnyRef, и имеет три дополнительных свойства:
-
Он согласован: для любых не-нулевых экземпляров
x и y типа AnyRef, многократные вызовы x.eq(y) всегда возвращают true или всегда возвращают false. Для любого не-нулевого экземпляра x типа AnyRef, x.eq(null) и null.eq(x) возвращают false.
null.eq(null) возвращает true. При переопределении методов equals или hashCode, важно убедиться, что их поведение согласуется с равенством ссылок. Поэтому, если два объекта являются ссылками друг на друга (o1 eq o2), они должны быть равны друг другу (o1 == o2) и иметь одинаковое хэш-значение (o1.hashCode == o2.hashCode).
- returns
trueесли аргумент является ссылкой на принимающий объект;falseв противном случае.
- Definition Classes
- AnyRef
def equals(arg0: AnyRef): Boolean
Метод равенства для ссылочных типов. Реализация по умолчанию делегирует в eq.
См. также equals в scala.Any.
- returns
trueесли принимающий объект эквивалентен аргументу;falseв противном случае.
- Definition Classes
- AnyRef → Any
def exists(p: (B) => Boolean): Boolean
Возвращает false если Left или возвращает результат применения данного предиката к значению Right.
Right(12).exists(_ > 10) // true Right(7).exists(_ > 10) // false Left(12).exists(_ => true) // false
def filterOrElse[A1 >: A](p: (B) => Boolean, zero: => A1): Either[A1, B]
Возвращает Right с существующим значением Right если это Right и данный предикат p верен для правого значения, или Left(zero) если это Right и данный предикат p неверен для правого значения, или Left с существующим значением Left если это Left.
Right(12).filterOrElse(_ > 10, -1) // Right(12) Right(7).filterOrElse(_ > 10, -1) // Left(-1) Left(7).filterOrElse(_ => false, -1) // Left(7)
def finalize(): Unit
Вызывается сборщиком мусора для объекта-получателя, когда на объект больше нет ссылок.
Подробности о том, когда и если вызывается метод finalize, а также о взаимодействии между finalize и нелокальными возвратами и исключениями, зависят от платформы.
def flatMap[A1 >: A, B1](f: (B) => Either[A1, B1]): Either[A1, B1]
Применяет заданную функцию к Right.
- f
Функция для применения к
Right.
def flatten[A1 >: A, B1](implicit ev: <:<[B, Either[A1, B1]]): Either[A1, B1]
Возвращает правое значение, если это правая ветвь, или текущее значение, если это левая ветвь.
val l: Either[String, Either[String, Int]] = Left("pancake")
val rl: Either[String, Either[String, Int]] = Right(Left("flounder"))
val rr: Either[String, Either[String, Int]] = Right(Right(7))
l.flatten //Either[String, Int]: Left("pancake")
rl.flatten //Either[String, Int]: Left("flounder")
rr.flatten //Either[String, Int]: Right(7)
Эквивалентно flatMap(id => id)
def fold[C](fa: (A) => C, fb: (B) => C): C
Применяет fa если это Left или fb если это Right.
- fa
функция для применения, если это
Left- fb
функция для применения, если это
Right- возвращает
результат применения функции
val result = util.Try("42".toInt).toEither
result.fold(
e => s"Operation failed with $e",
v => s"Operation produced value: $v"
)
def forall(f: (B) => Boolean): Boolean
Возвращает true если Left или возвращает результат применения заданного предиката к Right значению.
Right(12).forall(_ > 10) // true Right(7).forall(_ > 10) // false Left(12).forall(_ => false) // true
def foreach[U](f: (B) => U): Unit
Выполняет заданную функцию с побочным эффектом, если это Right.
Right(12).foreach(println) // prints "12" Left(12).foreach(println) // doesn't print
- f
Функция с побочным эффектом для выполнения.
def formatted(fmtstr: String): String
Возвращает строку, отформатированную в соответствии с заданной строкой format. Строки формата аналогичны String.format (@см. java.lang.String.format).
- Неявный
- Этот член добавлен неявным преобразованием из Either[A, B] в StringFormat[Either[A, B]] посредством метода StringFormat в scala.Predef.
- Определяющие классы
- StringFormat
- Аннотации
- @inline()
final def getClass(): Class[_ <: AnyRef]
Возвращает представление класса объекта во время выполнения.
- возвращает
объект класса, соответствующий типу получателя во время выполнения.
def getOrElse[B1 >: B](or: => B1): B1
Возвращает значение из этой Right или заданный аргумент, если это Left.
Right(12).getOrElse(17) // 12 Left(12).getOrElse(17) // 17
def hashCode(): Int
Метод hashCode для ссылочных типов. См. hashCode в scala.Any.
- возвращает
значение хэш-кода для этого объекта.
final def isInstanceOf[T0]: Boolean
Проверяет, является ли динамический тип объекта-получателя T0.
Обратите внимание, что результат проверки зависит от семантики стирания типов в Scala. Поэтому выражение 1.isInstanceOf[String] вернёт false, а выражение List(1).isInstanceOf[List[String]] вернёт true. В последнем примере, поскольку аргумент типа стирается во время компиляции, проверить, соответствуют ли элементы списка указанному типу, невозможно.
- returns
trueесли объект-получатель является экземпляром стёртого типаT0;falseв противном случае.
- Definition Classes
- Any
def joinLeft[A1 >: A, B1 >: B, C](implicit ev: <:<[A1, Either[C, B1]]): Either[C, B1]
Объединяет Either через Left.
Этот метод требует, чтобы левая часть этого Either была типом Either. То есть, это должен быть какой-то тип, похожий на:
Either[Either[C, B], B]
(что учитывает ограничения параметров типа, показанные ниже.)
Если этот экземпляр является Left[Either[C, B]] , то содержащееся Either[C, B] будет возвращено, в противном случае это значение будет возвращено без изменений.
Left[Either[Int, String], String](Right("flower")).joinLeft // Result: Right("flower")
Left[Either[Int, String], String](Left(12)).joinLeft // Result: Left(12)
Right[Either[Int, String], String]("daisy").joinLeft // Result: Right("daisy")
Этот метод, и joinRight, аналогичны Option#flatten.
def joinRight[A1 >: A, B1 >: B, C](implicit ev: <:<[B1, Either[A1, C]]): Either[A1, C]
Объединяет Either через Right.
Этот метод требует, чтобы правая часть этого Either была типом Either. То есть, это должен быть какой-то тип, похожий на:
Either[A, Either[A, C]]
(что учитывает ограничения параметров типа, показанные ниже.)
Если этот экземпляр является Right[Either[A, C]] , то содержащееся Either[A, C] будет возвращено, в противном случае это значение будет возвращено без изменений.
Right[String, Either[String, Int]](Right(12)).joinRight // Result: Right(12)
Right[String, Either[String, Int]](Left("flower")).joinRight // Result: Left("flower")
Left[String, Either[String, Int]]("flower").joinRight // Result: Left("flower")
Этот метод и joinLeft аналогичны Option#flatten
def left: LeftProjection[A, B]
Проецирует этот Either как Left.
Это позволяет использовать циклы for с левой стороной Either экземпляров, изменяя обычную правую направленность Either.
Например
for (s <- Left("flower").left) yield s.length // Left(6)
Продолжая аналогию с scala.Option, LeftProjection объявляет, что Left должно быть аналогично Some в некотором коде.
// using Option
def interactWithDB(x: Query): Option[Result] =
try Some(getResultFromDatabase(x))
catch {
case _: SQLException => None
}
// this will only be executed if interactWithDB returns a Some
val report = for (result <- interactWithDB(someQuery)) yield generateReport(result)
report match {
case Some(r) => send(r)
case None => log("report not generated, not sure why...")
}
// using Either
def interactWithDB(x: Query): Either[Exception, Result] =
try Right(getResultFromDatabase(x))
catch {
case e: SQLException => Left(e)
}
// run a report only if interactWithDB returns a Right
val report = for (result <- interactWithDB(someQuery)) yield generateReport(result)
report match {
case Right(r) => send(r)
case Left(e) => log(s"report not generated, reason was $e")
}
// only report errors
for (e <- interactWithDB(someQuery).left) log(s"query failed, reason was $e")
def map[B1](f: (B) => B1): Either[A, B1]
Применяет заданную функцию, если это Right.
Right(12).map(x => "flower") // Result: Right("flower")
Left(12).map(x => "flower") // Result: Left(12)
def merge: B
- Неявный
- Этот член добавляется неявным преобразованием из Either[A, B] в MergeableEither[B] при помощи метода MergeableEither в scala.util.Either.Это преобразование произойдёт только если B является суперклассом A (B >: A).
- Definition Classes
- MergeableEither
final def ne(arg0: AnyRef): Boolean
Эквивалентно !(this eq that).
- returns
trueесли аргумент не является ссылкой на объект-получатель;falseв противном случае.
- Definition Classes
- AnyRef
final def notify(): Unit
Разбуживает единственную нить, ждущую монитора объекта-получателя.
- Definition Classes
- AnyRef
- Annotations
- @native()
- Примечание
не указано в SLS как член AnyRef
final def notifyAll(): Unit
Разбуживает все нити, ждущие монитора объекта-получателя.
- Definition Classes
- AnyRef
- Annotations
- @native()
- Примечание
не указано в SLS как член AnyRef
def orElse[A1 >: A, B1 >: B](or: => Either[A1, B1]): Either[A1, B1]
Возвращает этот Right или заданный аргумент, если этот Left.
Right(1) orElse Left(2) // Right(1) Left(1) orElse Left(2) // Left(2) Left(1) orElse Left(2) orElse Right(3) // Right(3)
def productElementName(n: Int): String
Имя n-го элемента этого продукта, нумерация с 0. В стандартной реализации — пустая строка.
- n
индекс имени элемента для возврата
- returns
имя указанного элемента
- Definition Classes
- Product
- Исключения
IndexOutOfBoundsExceptionеслиnнаходится вне допустимого диапазона (n < 0 || n >= productArity).
def productElementNames: Iterator[String]
Итератор по именам всех элементов этого продукта.
- Definition Classes
- Product
def productIterator: Iterator[Any]
Итератор по всем элементам этого продукта.
- returns
в стандартной реализации,
Iterator[Any]
- Definition Classes
- Product
def productPrefix: String
Строка, используемая в методах toString производных классов. Реализации могут переопределить этот метод, чтобы добавить префикс к результату методов toString.
- returns
в стандартной реализации, пустая строка
- Definition Classes
- Product
def swap: Either[B, A]
Если это Left, вернуть левое значение в Right или наоборот.
val left: Either[String, Int] = Left("left")
val right: Either[Int, String] = left.swap // Result: Right("left"),
val right = Right(2)
val left = Left(3)
for {
r1 <- right
r2 <- left.swap
} yield r1 * r2 // Right(6)
final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
def toOption: Option[B]
Возвращает Some, содержащую значение Right, если оно существует, или None, если это Left.
Right(12).toOption // Some(12) Left(12).toOption // None
def toSeq: collection.immutable.Seq[B]
Возвращает Seq содержащую значение Right, если оно существует, или пустую Seq если это Left.
Right(12).toSeq // Seq(12) Left(12).toSeq // Seq()
def toString(): String
Создает строковое представление этого объекта. Стандартное представление зависит от платформы. На платформе Java это конкатенация имени класса, «@» и хэш-кода объекта в шестнадцатеричном формате.
- returns
строковое представление объекта.
- Definition Classes
- AnyRef → Any
def toTry(implicit ev: <:<[A, Throwable]): Try[B]
final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
final def wait(arg0: Long): Unit
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala/util/Either.html
Представляет значение одного из двух возможных типов (дизъюнктивное объединение). Экземпляр
Eitherявляется экземпляром либо scala.util.Left, либо scala.util.Right.Распространенное применение
Either— в качестве альтернативы scala.Option для работы с потенциально отсутствующими значениями. В этом случае scala.None заменяется на scala.util.Left, которое может содержать полезную информацию. scala.util.Right занимает место scala.Some. Конвенция гласит, чтоLeftиспользуется для ошибок, аRight— для успехов.Например, вы можете использовать
Either[String, Int]для указания, является ли полученный входStringилиInt.import scala.io.StdIn._ val in = readLine("Type Either a string or an Int: ") val result: Either[String,Int] = try Right(in.toInt) catch { case e: NumberFormatException => Left(in) } result match { case Right(x) => s"You passed me the Int: $x, which I will increment. $x + 1 = ${x+1}" case Left(x) => s"You passed me the String: $x" }Eitherимеет правостороннюю предвзятость, что означает, чтоRightпредполагается в качестве значения по умолчанию для обработки. Если этоLeft, операции, такие какmapиflatMapвозвращают значениеLeftбез изменений:Поскольку
Eitherопределяет методыmapиflatMap, его также можно использовать в for-выражениях:val right1 = Right(1) : Right[Double, Int] val right2 = Right(2) val right3 = Right(3) val left23 = Left(23.0) : Left[Double, Int] val left42 = Left(42.0) for { x <- right1 y <- right2 z <- right3 } yield x + y + z // Right(6) for { x <- right1 y <- right2 z <- left23 } yield x + y + z // Left(23.0) for { x <- right1 y <- left23 z <- right2 } yield x + y + z // Left(23.0) // Guard expressions are not supported: for { i <- right1 if i > 0 } yield i // error: value withFilter is not a member of Right[Double,Int] // Similarly, refutable patterns are not supported: for (x: Int <- right1) yield x // error: value withFilter is not a member of Right[Double,Int]Поскольку
forиспользуетmapиflatMap, типы параметров функций в выражении должны быть выведены. Эти типы ограничены значениямиEither. В частности, из-за правосторонней предвзятости значенияLeftмогут потребовать явного аргумента типа для параметра типаB, правого значения. В противном случае он может быть выведен какNothing.for { x <- left23 y <- right1 z <- left42 // type at this position: Either[Double, Nothing] } yield x + y + z // ^ // error: ambiguous reference to overloaded definition, // both method + in class Int of type (x: Char)Int // and method + in class Int of type (x: Byte)Int // match argument types (Nothing) for (x <- right2 ; y <- left23) yield x + y // Left(23.0) for (x <- right2 ; y <- left42) yield x + y // error for { x <- right1 y <- left42 // type at this position: Either[Double, Nothing] z <- left23 } yield x + y + z // Left(42.0), but unexpectedly a `Either[Double,String]`2.7