Spec-Zone.ru › Scala 3.1

Класс scala.util.Left

Исходный код

final case class Left[+A, +B](value: A) extends Either[A, B]

Левая сторона неразрывного объединения, в отличие от правой стороны scala.util.Right.

Надтипы
Класс Either[A, B]
Тракт Serializable
Тракт Product
Тракт Equals
Класс Object
Тракт Matchable
Класс Any

Конкретные методы

Исходный код
def isLeft: Boolean

Исходный код
def isRight: Boolean

Исходный код
def withRight[B1 >: B]: Either[A, B1]

Преобразует этот Left[A, B] к Either[A, B1]

Left(1)                   // Either[Int, Nothing]
Left(1).withRight[String] // Either[Int, String]

Наследованные методы

Исходный код
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.

Наследуется из Either

Исходный код
def exists(p: B => Boolean): Boolean

Возвращает false если Left или возвращает результат применения заданного предиката к значению Right

Right(12).exists(_ > 10)   // true
Right(7).exists(_ > 10)    // false
Left(12).exists(_ => true) // false
Наследуется из Either

Исходный код
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)
Наследуется из Either

Исходный код
def flatMap[A1 >: A, B1](f: B => Either[A1, B1]): Either[A1, B1]

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

Параметры значения
f

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

Наследуется из Either

Исходный код
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)

Наследуется из Either

Исходный код
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"
)
Наследуется из Either

Исходный код
def forall(f: B => Boolean): Boolean

Возвращает true если Left или возвращает результат применения заданного предиката к значению Right

Right(12).forall(_ > 10)    // true
Right(7).forall(_ > 10)     // false
Left(12).forall(_ => false) // true
Наследуется из Either

Исходный код
def foreach[U](f: B => U): Unit

Выполняет заданную функцию с побочным эффектом, если это Right

Right(12).foreach(println) // prints "12"
Left(12).foreach(println)  // doesn't print
Параметры значения
f

Функция с побочным эффектом для выполнения.

Наследуется из Either

Исходный код
def getOrElse[B1 >: B](or: => B1): B1

Возвращает значение из этого Right или заданный аргумент, если это Left

Right(12).getOrElse(17) // 12
Left(12).getOrElse(17)  // 17
Наследуется из Either

Исходный код
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

Наследуется из Either

Исходный код
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

Наследуется из Either

Исходный код
def left: LeftProjection[A, B]

Проектирует этот Either как Left

Это позволяет для-понимания по левой стороне 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")
Наследуется из Either

Источник
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)
Унаследовано от Either

Источник
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)
Унаследовано от Either

Источник
def productElementNames: Iterator[String]

Итератор по именам всех элементов этого продукта.

Унаследовано от Product

Источник
def productIterator: Iterator[Any]

Итератор по всем элементам этого продукта.

Возвращает

в реализации по умолчанию, Iterator[Any]

Унаследовано от 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)
Унаследовано от Either

Источник
def toOption: Option[B]

Возвращает Some, содержащую значение Right, если оно существует, или None, если это Left.

Right(12).toOption // Some(12)
Left(12).toOption  // None
Унаследовано от Either

Источник
def toSeq: Seq[B]

Возвращает Seq, содержащую значение Right, если оно существует, или пустую Seq, если это Left.

Right(12).toSeq // Seq(12)
Left(12).toSeq  // Seq()
Унаследовано от Either

Источник
def toTry(implicit ev: A <:< Throwable): Try[B]

Унаследовано от Either

© 2002-2022 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://scala-lang.org/api/3.1.1/scala/util/Left.html

Spec-Zone.ru

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