Spec-Zone.ru › Scala 3.1

Класс scala.util.Right

Исходный код

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

Правая сторона неразделимого объединения, в отличие от scala.util.Left.

Суперадресаты
класс Either[A, B]
интерфейс Serializable
интерфейс Product
интерфейс Equals
класс Object
интерфейс Matchable
класс Any

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

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

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

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

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

Right("x")               // Either[Nothing, String]
Right("x").withLeft[Int] // 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

Source
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

Source
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

Source
def productElementNames: Iterator[String]

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

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

Source
def productIterator: Iterator[Any]

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

Возвращает

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

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

Source
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

Source
def toOption: Option[B]

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

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

Source
def toSeq: Seq[B]

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

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

Source
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/Right.html

Spec-Zone.ru

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