Spec-Zone.ru › Scala 3.2

Класс Left.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

Возвращает 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 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.

Это позволяет использовать 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")
Наследуется от 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.2.0/scala/util/Left.html

Spec-Zone.ru

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