Spec-Zone.ru › Scala 2.13 Library

Особенность scala.PartialFunction

Компаньон объект PartialFunction

trait PartialFunction[-A, +B] extends (A) => B

Частичная функция типа PartialFunction[A, B] — это унарная функция, область определения которой необязательно включает все значения типа A. Функция isDefinedAt позволяет динамически проверить, находится ли значение в области определения функции.

Даже если isDefinedAt возвращает true для a: A, вызов apply(a) может всё ещё вызвать исключение, поэтому следующий код является корректным:

val f: PartialFunction[Int, Any] = { case _ => 1/0 }

Ответственность за вызов isDefinedAt перед вызовом apply лежит на вызывающей стороне, потому что если isDefinedAt ложно, не гарантируется, что apply выбросит исключение для обозначения ошибки. Если исключение не выброшено, оценка может привести к произвольному значению.

Основное различие между PartialFunction и scala.Function1 заключается в том, что пользователь PartialFunction может выбрать другой способ обработки входных данных, которые объявлены за пределами его области определения. Например:

val sample = 1 to 10
val isEven: PartialFunction[Int, String] = {
  case x if x % 2 == 0 => x+" is even"
}

// the method collect can use isDefinedAt to select which members to collect
val evenNumbers = sample collect isEven

val isOdd: PartialFunction[Int, String] = {
  case x if x % 2 == 1 => x+" is odd"
}

// the method orElse allows chaining another partial function to handle
// input outside the declared domain
val numbers = sample map (isEven orElse isOdd)
Self Type
PartialFunction[A, B]
Source
PartialFunction.scala
Since

1.0

Note

Дополнительные функции Function, частичные функции PartialFunction и объекты-экстракторы могут быть преобразованы друг в друга, как показано в следующей таблице. | Как преобразовать ... | в PartialFunction | в необязательную Function | в экстрактор | | :---: | --- | --- | --- | | из PartialFunction | Predef.identity | lift | Predef.identity | | из необязательной Function | Function.UnliftOps#unlift или Function.unlift | Predef.identity | Function.UnliftOps#unlift | | из экстрактора | { case extractor(x) => x } | extractor.unapply _ | Predef.identity |

Линейные супертипы
(A) => B, AnyRef, Any
Известные подклассы
AbstractMap, AbstractMapView, AbstractSeq, IndexedSeq, LinearSeq, Map, MapFactoryDefaults, MapOps, MapView, Filter, FilterKeys, Id, MapValues, TapEach, Seq, SeqMap, SortedMap, SortedMapFactoryDefaults, SortedMapOps, StrictOptimizedMapOps, StrictOptimizedSortedMapOps, Map, TrieMap, ::, AbstractMap, AbstractSeq, ArraySeq, ofBoolean, ofByte, ofChar, ofDouble, ofFloat, ofInt, ofLong, ofRef, ofShort, ofUnit, HashMap, IndexedSeq, IntMap, LazyList, LinearSeq, List, ListMap, LongMap, Map, Map1, Map2, Map3, Map4, WithDefault, MapOps, Nil, NumericRange, Exclusive, Inclusive, Queue, Range, Exclusive, Inclusive, Seq, SeqMap, SortedMap, WithDefault, SortedMapOps, Cons, Empty, StrictOptimizedMapOps, StrictOptimizedSortedMapOps, TreeMap, TreeSeqMap, Vector, VectorMap, WrappedString, AbstractBuffer,
AbstractMap, AbstractSeq, AnyRefMap, ArrayBuffer, ArrayDeque, ArraySeq, ofBoolean, ofByte, ofChar, ofDouble, ofFloat, ofInt, ofLong, ofRef, ofShort, ofUnit, Buffer, CollisionProofHashMap, HashMap, IndexedBuffer, IndexedSeq, LinkedHashMap, ListBuffer, LongMap, Map, WithDefault, MapOps, MultiMap, Queue, Seq, SeqMap, SortedMap, WithDefault, SortedMapOps, Stack, StringBuilder, TreeMap, UnrolledBuffer, WeakHashMap, Accumulator, AnyAccumulator, DoubleAccumulator, IntAccumulator, LongAccumulator, SystemProperties, DefaultMap, Stream, ListMap, OpenHashMap

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

abstract def apply(v1: A): B

Применяет тело этой функции к аргументу.

возвращает

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

Definition Classes
Function1

abstract def isDefinedAt(x: A): Boolean

Проверяет, содержится ли значение в области определения функции.

x

значение для проверки

возвращает

true, если x находится в области определения этой функции, false в противном случае.

Члены-значения конкретного типа

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

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

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

Implicit
Этот член добавляется неявным преобразованием из PartialFunction[A, B] в ArrowAssoc[PartialFunction[A, B]] посредством метода ArrowAssoc в scala.Predef. Это преобразование произойдёт только если B является подклассом Option[Nothing] (B <: Option[Nothing]).
Definition Classes
ArrowAssoc
Annotations
@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

def andThen[C](k: PartialFunction[B, C]): PartialFunction[A, C]

Композиция этой частичной функции с другой частичной функцией, которая применяется к результатам этой частичной функции.

Обратите внимание, что вызов isDefinedAt на результирующей частичной функции может применить первую частичную функцию и выполнить её побочный эффект. Сильно рекомендуется использовать applyOrElse вместо isDefinedAt / apply для повышения эффективности.

C

тип результата функции преобразования.

k

функция преобразования

returns

частичная функция с областью определения этой частичной функции, суженной другой частичной функцией, которая сопоставляет аргументы x с k(this(x)).

def andThen[C](k: (B) => C): PartialFunction[A, C]

Композиция этой частичной функции с функцией преобразования, которая применяется к результатам этой частичной функции.

Если тип функции во время выполнения является PartialFunction, то используется другой метод andThen (см. его замечания).

C

тип результата функции преобразования.

k

функция преобразования

returns

частичная функция с областью определения этой частичной функции, возможно суженной заданной функцией, которая сопоставляет аргументы x с k(this(x)).

Definition Classes
PartialFunction → Function1

def applyOrElse[A1 <: A, B1 >: B](x: A1, default: (A1) => B1): B1

Применяет эту частичную функцию к заданному аргументу, когда он содержится в области определения функции. Применяет резервную функцию, где эта частичная функция не определена.

Обратите внимание, что выражение pf.applyOrElse(x, default) эквивалентно

if(pf isDefinedAt x) pf(x) else default(x)

за исключением того, что метод applyOrElse может быть реализован более эффективно. Для всех литералов частичных функций компилятор генерирует реализацию applyOrElse, которая избегает двойной оценки согласующих шаблонов и охранников. Это делает applyOrElse основой для эффективной реализации многих операций и сценариев, таких как:

    комбинирование частичных функций в цепочки orElse/andThen не приводит к чрезмерной оценке apply/isDefinedAt lift и unlift не оценивают исходные функции дважды при каждом вызове runWith позволяет эффективное императивное комбинирование частичных функций с условно применяемыми действиями

Для нелитеральных классов частичных функций с нетривиальным методом isDefinedAt рекомендуется переопределить applyOrElse с помощью пользовательской реализации, которая избегает двойной оценки isDefinedAt. Это может привести к лучшей производительности и более предсказуемому поведению в отношении побочных эффектов.

x

аргумент функции

default

резервная функция

returns

результат применения этой функции или резервной функции.

Since

2.10

final def asInstanceOf[T0]: T0

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

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

returns

получаемый объект.

Definition Classes
Any
Exceptions thrown

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

def clone(): AnyRef

Создать копию получаемого объекта.

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

returns

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

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws(classOf[java.lang.CloneNotSupportedException]) @native()
Note

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

def compose[R](k: PartialFunction[R, A]): PartialFunction[R, B]

Комбинирует другую частичную функцию k с этой частичной функцией так, чтобы эта частичная функция применялась к результатам k.

Обратите внимание, что вызов isDefinedAt для результирующей частичной функции может применить первую частичную функцию и выполнить её побочный эффект. Настоятельно рекомендуется вызывать applyOrElse вместо isDefinedAt / apply для повышения эффективности.

R

тип параметра функции преобразования.

k

функция преобразования

returns

частичная функция с областью определения другой частичной функции, суженной этой частичной функцией, которая отображает аргументы x на this(k(x)).

def compose[A](g: (A) => A): (A) => B

Комбинирует два экземпляра Function1 в новый Function1, при этом эта функция применяется последней.

A

тип, к которому может быть применена функция g

g

функция A => T1

returns

новая функция f такая, что f(x) == apply(g(x))

Definition Classes
Function1
Annotations
@unspecialized()

def elementWise: ElementWiseExtractor[A, B]

Возвращает объект-извлекатель с методом unapplySeq, который извлекает каждый элемент последовательных данных.

Example:
    val firstChar: String => Option[Char] = _.headOption
    
    Seq("foo", "bar", "baz") match {
      case firstChar.unlift.elementWise(c0, c1, c2) =>
        println(s"$c0, $c1, $c2") // Output: f, b, b
    }

def ensuring(cond: (PartialFunction[A, B]) => Boolean, msg: => Any): PartialFunction[A, B]

Implicit
Этот член добавляется неявным преобразованием из PartialFunction[A, B] в Ensuring[PartialFunction[A, B]] с помощью метода Ensuring в scala.Predef.
Definition Classes
Ensuring

def ensuring(cond: (ЧастичнаяФункция[A, B]) => Boolean): ЧастичнаяФункция[A, B]

Неявный
Этот член добавлен неявным преобразованием из ЧастичнаяФункция[A, B] в Ensuring[ЧастичнаяФункция[A, B]], выполненным методом Ensuring в scala.Predef.
Определяющие классы
Ensuring

def ensuring(cond: Boolean, msg: => Любой): ЧастичнаяФункция[A, B]

Неявный
Этот член добавлен неявным преобразованием из ЧастичнаяФункция[A, B] в Ensuring[ЧастичнаяФункция[A, B]], выполненным методом Ensuring в scala.Predef.
Определяющие классы
Ensuring

def ensuring(cond: Boolean): ЧастичнаяФункция[A, B]

Неявный
Этот член добавлен неявным преобразованием из ЧастичнаяФункция[A, B] в Ensuring[ЧастичнаяФункция[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: AnyRef): Boolean

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

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

возвращает

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

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

def finalize(): Unit

Вызывается сборщиком мусора для объекта-приёмника, когда больше нет ссылок на объект.

Подробности о том, когда и если вызывается метод finalize, а также взаимодействие между finalize и нелокальными возвратами и исключениями, зависят от платформы.

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

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

def formatted(fmtstr: String): String

Возвращает строку, отформатированную в соответствии с заданной строкой format. Форматные строки аналогичны String.format (@см. java.lang.String.format).

Неявный
Этот член добавлен неявным преобразованием из ЧастичнаяФункция[A, B] в StringFormat[ЧастичнаяФункция[A, B]] выполненным методом StringFormat в scala.Predef.
Определяющие классы
StringFormat
Аннотации
@inline()

final def getClass(): Class[_ <: AnyRef]

Возвращает представление класса объекта во время выполнения.

возвращает

объект класса, соответствующий типу получателя во время выполнения.

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

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 lift: (A) => Option[B]

Преобразует эту частичную функцию в обычную функцию, возвращающую Option результат.

возвращает

функция, которая принимает аргумент x в Some(this(x)) если this определена для x, и в None в противном случае.

См. также

Function.unlift

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 orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

Комбинирует эту частичную функцию с резервной частичной функцией, которая применяется в случаях, когда эта частичная функция не определена.

A1

тип аргумента резервной функции

B1

тип результата резервной функции

that

резервная функция

возвращает

частичная функция, чья область определения — объединение областей определения этой частичной функции и that. Результирующая частичная функция принимает x в this(x) там, где this определена, и в that(x) в противном случае.

def runWith[U](action: (B) => U): (A) => Boolean

Комбинирует эту частичную функцию с функцией действия, которая применяется к результатам этой частичной функции. Функция действия вызывается только для своих побочных эффектов; её результат игнорируется.

Обратите внимание, что выражение pf.runWith(action)(x) эквивалентно

if(pf isDefinedAt x) { action(pf(x)); true } else false

за исключением того, что runWith реализована с помощью applyOrElse и, следовательно, потенциально более эффективна. Использование runWith позволяет избежать двойной оценки совпадений шаблонов и условий для частичных функций-литералов.

action

функция действия

возвращает

функция, которая отображает аргументы x в isDefinedAt(x). Результирующая функция выполняет action(this(x)) там, где this определена.

С

2.10

См. также

applyOrElse.

final def synchronized[T0](arg0: => T0): T0

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

def toString(): String

Создаёт строковое представление этого объекта. По умолчанию представление зависит от платформы. На платформе Java это конкатенация имени класса, «@» и хэш-кода объекта в шестнадцатеричном формате.

возвращает

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

Классы определений
Function1 → AnyRef → Any

def unapply(a: A): Option[B]

def unlift: PartialFunction[A, B]

Преобразует опциональную функцию в частичную функцию.

Неявный
Этот член добавляется неявным преобразованием из PartialFunction[A, B] вUnliftOps[A, B] выполняемое методом UnliftOps в scala.Function1.Это преобразование будет выполнено только в том случае, если B является подклассом Option[B] (B <: Option[B]).
Определяющие классы
UnliftOps
Пример:

    В отличие от Function.unlift, этот метод UnliftOps.unlift может быть использован в экстракторах.

    val of: Int => Option[String] = { i =>
      if (i == 2) {
        Some("matched by an optional function")
      } else {
        None
      }
    }
    
    util.Random.nextInt(4) match {
      case of.unlift(m) => // Convert an optional function to a pattern
        println(m)
      case _ =>
        println("Not matched")
    }

final def wait(): Unit

Определяющие классы
AnyRef
Аннотации
@throws(classOf[java.lang.InterruptedException])

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

Определяющие классы
AnyRef
Аннотации
@throws(classOf[java.lang.InterruptedException])

final def wait(arg0: Long): Unit

Определяющие классы
AnyRef
Аннотации
@throws(classOf[java.lang.InterruptedException]) @native()

© 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/PartialFunction.html

Spec-Zone.ru

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