Особенность scala.PartialFunction
Компаньон объект PartialFunction
trait PartialFunction[-A, +B] extends (A) => B
- 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
копия получаемого объекта.
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, который извлекает каждый элемент последовательных данных.
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 и нелокальными возвратами и исключениями, зависят от платформы.
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]
Возвращает представление класса объекта во время выполнения.
- возвращает
объект класса, соответствующий типу получателя во время выполнения.
def hashCode(): Int
Метод hashCode для ссылочных типов. См. hashCode в scala.Any.
- возвращает
значение хэш-кода для этого объекта.
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 это конкатенация имени класса, «@» и хэш-кода объекта в шестнадцатеричном формате.
- возвращает
строковое представление объекта.
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
© 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
Частичная функция типа
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)1.0
Дополнительные функции 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 |