Spec-Zone.ru › Scala 2.12 Library

Класс scala.util.Either

Компонент объект Either

обобщённый абстрактный класс Either[+A, +B] extends Product с Serializable

Представляет значение одного из двух возможных типов (дизъюнктивное объединение). Экземпляр 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 без изменений:

def doubled(i: Int) = i * 2
Right(42).map(doubled) // Right(84)
Left(42).map(doubled)  // Left(42)

Поскольку 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 в 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]`
Источник
Either.scala
С тех пор

2.7

Линейные надтипы
Известные подклассы

Абстрактные члены-значения

абстрактный 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
Исключения

Члены-значения

final def !=(arg0: Any): Boolean

Проверка двух объектов на неравенство.

returns

true если !(this == that), в противном случае false.

Definition Classes
AnyRef → Any

final def ##(): Int

Эквивалентно x.hashCode за исключением упакованных числовых типов и null. Для числовых типов возвращает значение хэша, которое соответствует равенству значений: если два экземпляра типа значения сравниваются как true, то ## вернёт одинаковое значение хэша для каждого из них. Для null возвращает хэш-код, где null.hashCode генерирует NullPointerException.

returns

значение хэша, согласованное с ==

Definition Classes
AnyRef → Any

def +(other: String): String

Неявный
Этот член добавлен неявным преобразованием из Either[A, B] в any2stringadd[Either[A, B]] при помощи метода any2stringadd в scala.Predef.
Definition Classes
any2stringadd

def ->[B](y: B): (Either[A, B], B)

Неявный
Этот член добавлен неявным преобразованием из Either[A, B] в ArrowAssoc[Either[A, B]] при помощи метода ArrowAssoc в scala.Predef.
Definition Classes
ArrowAssoc
Аннотации
@inline()

final def ==(arg0: Any): Boolean

Выражение x == that эквивалентно if (x eq null) that eq null else x.equals(that).

returns

true если объект-получатель эквивалентен аргументу; false в противном случае.

Definition Classes
AnyRef → Any

final def asInstanceOf[T0]: T0

Преобразует объект-получатель к типу T0.

Обратите внимание, что успех преобразования во время выполнения зависит от семантики стирания Scala. Поэтому выражение 1.asInstanceOf[String] вызовет ClassCastException во время выполнения, в то время как выражение List(1).asInstanceOf[List[String]] этого не сделает. В последнем примере, поскольку тип аргумента стирается при компиляции, невозможно проверить, соответствуют ли значения в списке требуемому типу.

returns

объект-получатель.

Definition Classes
Any
Исключения

ClassCastException, если объект-получатель не является экземпляром стирания типа T0.

def clone(): AnyRef

Создаёт копию объекта-получателя.

По умолчанию реализация метода clone зависит от платформы.

returns

копия объекта-получателя.

Атрибуты
protected[lang]
Definition Classes
AnyRef
Аннотации
@throws( ... ) @native()
Примечание

не определено SLS как член AnyRef

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

элемент для проверки.

returns

true если это Right значение, равное elem.

def ensuring(cond: (Either[A, B]) ⇒ Boolean, msg: ⇒ Any): Either[A, B]

Неявный
Этот член добавлен неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]] при помощи метода Ensuring в scala.Predef.
Definition Classes
Ensuring

def ensuring(cond: (Either[A, B]) ⇒ Boolean): Either[A, B]

Неявный
Этот член добавлен неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]] с помощью метода Ensuring в scala.Predef.
Классы определения
Ensuring

def ensuring(cond: Boolean, msg: ⇒ Any): Either[A, B]

Неявный
Этот член добавлен неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]] с помощью метода Ensuring в scala.Predef.
Классы определения
Ensuring

def ensuring(cond: Boolean): Either[A, B]

Неявный
Этот член добавлен неявным преобразованием из Either[A, B] в Ensuring[Either[A, B]] с помощью метода Ensuring в scala.Predef.
Классы определения
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).

возвращает

true если аргумент является ссылкой на объект-получатель; false в противном случае.

Классы определения
AnyRef

def equals(arg0: Any): Boolean

Метод равенства для ссылочных типов. Реализация по умолчанию делегирует в eq.

См. также equals в scala.Any.

возвращает

true если объект-получатель эквивалентен аргументу; false в противном случае.

Классы определения
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 и нелокальных возвратов и исключений зависят от платформы.

Атрибуты
protected[lang]
Классы определения
AnyRef
Аннотации
@throws( classOf[java.lang.Throwable] )
Примечание

не определен SLS в качестве члена AnyRef

def flatMap[A1 >: A, B1](f: (B) ⇒ Either[A1, B1]): Either[A1, B1]

Связывает заданную функцию с Right.

f

Функция для связи с Right.

def fold[C](fa: (A) ⇒ C, fb: (B) ⇒ C): C

Применяет fa если это Left или fb если это Right.

fa

функцию для применения, если это Left

fb

функцию для применения, если это Right

returns

результат применения функции

Пример:
    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 → Any
Аннотации
@native()

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.

возвращает

значение хэш-кода для этого объекта.

Классы определений
AnyRef → Any
Аннотации
@native()

final def isInstanceOf[T0]: Boolean

Проверяет, является ли динамический тип объекта получателя T0.

Обратите внимание, что результат проверки выполняется по модулю семантики стирания Scala. Поэтому выражение 1.isInstanceOf[String] вернёт false, а выражение List(1).isInstanceOf[List[String]] вернёт true. В последнем примере, поскольку аргумент типа стёрт во время компиляции, проверить, являются ли элементы списка указанного типа, невозможно.

возвращает

true если объект получателя является экземпляром стёртого типа T0; false в противном случае.

Классы определений
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.
Определяющие классы
MergeableEither

final def ne(arg0: AnyRef): Boolean

Эквивалентно !(this eq that).

возвращает

true если аргумент не является ссылкой на объект-получатель; false в противном случае.

Определяющие классы
AnyRef

final def notify(): Unit

Разбуждает единственную нить, которая ожидает монитора объекта-получателя.

Определяющие классы
AnyRef
Аннотации
@native()
Примечание

не указано SLS в качестве члена AnyRef

final def notifyAll(): Unit

Разбуждает все нити, которые ожидают монитора объекта-получателя.

Определяющие классы
AnyRef
Аннотации
@native()
Примечание

не указано SLS в качестве члена AnyRef

def productIterator: Iterator[Any]

Итератор по всем элементам этого произведения.

возвращает

в стандартной реализации, Iterator[Any]

Определяющие классы
Product

def productPrefix: String

Строка, используемая в toString методах производных классов. Реализации могут переопределять этот метод, чтобы добавить префикс строки к результату toString методов.

возвращает

в стандартной реализации, пустая строка

Определяющие классы
Product

def right: RightProjection[A, B]

Проектирует этот Either как Right.

Поскольку Either имеет предвзятость вправо, этот метод обычно не нужен.

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

Определяющие классы
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 это конкатенация имени класса, «@» и хэш-кода объекта в шестнадцатеричном формате.

возвращает

строковое представление объекта.

Определяющие классы
AnyRef → Any

def toTry(implicit ev: <:<[A, Throwable]): Try[B]

final def wait(): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )

final def wait(arg0: Long, arg1: Int): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )

final def wait(arg0: Long): Unit

Definition Classes
AnyRef
Annotations
@throws( ... ) @native()

def →[B](y: B): (Either[A, B], B)

Неявное
Этот член добавлен с помощью неявного преобразования из Either[A, B] в ArrowAssoc[Either[A, B]] с помощью метода ArrowAssoc в scala.Predef.
Definition Classes
ArrowAssoc

© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.12.9/scala/util/Either.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API