Spec-Zone.ru › Scala 2.13 Library

Пакет scala.collection.generic

пакет generic

Источник
package.scala
Линейные супертипы
AnyRef, Any

Члены типов

тракт DefaultSerializable extends Serializable

Миксин-тракт для включения DefaultSerializationProxy для стандартных типов коллекций. В зависимости от типа, в который он включён, он динамически выберет iterableFactory, mapFactory, sortedIterableFactory или sortedMapFactory для десериализации в соответствующий тип CC. Переопределите writeReplace или реализуйте его напрямую без использования этого тракта, если вам нужен нестандартный фабричный метод или если вы хотите использовать другую схему сериализации.

final класс DefaultSerializationProxy[A] extends Serializable

По умолчанию прокси для сериализации коллекций.

Этот класс final и требует дополнительного объекта Factory, а не оставлять детали создания Builder абстрактным методам, которые могут быть реализованы подклассом. Это необходимо, потому что фабрика нужна для десериализации приватного состояния этого класса, что происходит до десериализации каких-либо полей подклассов. Любое дополнительное состояние, необходимое для создания соответствующего Builder, должно быть захвачено factory.

Аннотации
@SerialVersionUID()

тракт IsIterable[Repr] extends IsIterableOnce[Repr]

Тракт, который может быть использован для избежания дублирования кода при определении расширяющих методов, которые должны применяться как к существующим коллекциям Scala (т.е. типам, наследующим Iterable) так и к другим (возможно, определённым пользователем) типам, которые могут быть преобразованы в тип коллекции Scala. Этот тракт позволяет единообразно обрабатывать коллекции Scala и типы, которые могут быть неявным образом преобразованы в тип коллекции. Например, можно предоставить расширяющие методы, которые работают как с типами коллекций, так и с String (String не наследуют Iterable, но могут быть преобразованы в Iterable)

IsIterable предоставляет три члена:

    тип член A, который представляет тип элемента целевого Iterable[A]тип член C, который представляет тип, возвращаемый операциями преобразования, сохраняющими типы элементов коллекцииметод apply, который обеспечивает способ преобразования между типом, к которому мы хотим добавить расширяющие методы, Repr, и IterableOps[A, Iterable, C].
Использование

Необходимо предоставить IsIterable в качестве неявного параметра типа неявного преобразования. Его использование показано ниже. Наша цель в следующем примере - предоставить универсальный расширяющий метод mapReduce для любого типа, который наследует или может быть преобразован к Iterable. В нашем примере, это включает String.

  import scala.collection.{Iterable, IterableOps}
  import scala.collection.generic.IsIterable

  class ExtensionMethods[Repr, I <: IsIterable[Repr]](coll: Repr, it: I) {
    def mapReduce[B](mapper: it.A => B)(reducer: (B, B) => B): B = {
      val iter = it(coll).iterator
      var res = mapper(iter.next())
      while (iter.hasNext)
        res = reducer(res, mapper(iter.next()))
      res
    }
  }

  implicit def withExtensions[Repr](coll: Repr)(implicit it: IsIterable[Repr]): ExtensionMethods[Repr, it.type] =
    new ExtensionMethods(coll, it)

// See it in action!
List(1, 2, 3).mapReduce(_ * 2)(_ + _) // res0: Int = 12
"Yeah, well, you know, that's just, like, your opinion, man.".mapReduce(x => 1)(_ + _) // res1: Int = 59

Здесь мы начинаем с создания класса ExtensionMethods, который содержит наш mapReduce расширяющий метод.

Обратите внимание, что ExtensionMethods принимает аргумент конструктора coll типа Repr, где Repr представляет (как правило) тип коллекции, и аргумент it типа подтипа IsIterable[Repr]. Тело метода начинается с преобразования аргумента coll в IterableOps для вызова метода iterator на нём. Остальная часть реализации проста.

Неявное преобразование withExtensions делает операцию mapReduce доступной для любого типа Repr, для которого оно существует в виде неявного IsIterable[Repr] экземпляра. Обратите внимание, как мы отслеживаем точный тип аргумента неявного it используя тип-синглтон it.type, а не более широкий тип IsIterable[Repr]. Мы делаем это, чтобы информация, переданная через члены типа A и C аргумента it, не терялась.

Когда метод mapReduce вызывается для какого-либо типа, не являющегося его членом, запускается поиск неявных значений. Поскольку неявное преобразование withExtensions универсальное, оно будет применено, пока не будет найдено неявное значение типа IsIterable[Repr] . Учитывая, что компаньон-объект IsIterable содержит неявные члены, возвращающие значения типа IsIterable, это требование обычно удовлетворяется, и запускается цепочка взаимодействий, описанная в предыдущем абзаце. (См. компаньон-объект IsIterable, который содержит точное описание доступных неявных значений).

Примечание: В настоящее время невозможно объединить неявное преобразование и класс с расширяющими методами в неявный класс из-за ограничений вывода типов.

Реализация IsIterable для новых типов

Просто необходимо предоставить неявное значение типа IsIterable для нового типа или неявное преобразование, возвращающее экземпляр IsIterable для нового типа.

Ниже приведен пример реализации тракта IsIterable, где тип Repr - Range.

implicit val rangeRepr: IsIterable[Range] { type A = Int; type C = IndexedSeq[Int] } =
  new IsIterable[Range] {
    type A = Int
    type C = IndexedSeq[Int]
    def apply(coll: Range): IterableOps[Int, IndexedSeq, IndexedSeq[Int]] = coll
  }

(Обратите внимание, что на практике экземпляр IsIterable[Range] уже предоставляется стандартной библиотекой, и он определён как экземпляр IsSeq[Range])

тракт IsIterableLowPriority extends AnyRef

тракт IsIterableOnce[Repr] extends AnyRef

Тип класса, свидетельствующий о том, что тип представления коллекции Repr имеет элементы типа A и имеет преобразование в IterableOnce[A].

Этот тип позволяет просто обогатить IterableOnce расширяющими методами, которые могут в полной мере использовать механизмы фреймворка коллекций Scala в своей реализации.

Пример использования,

class FilterMapImpl[Repr, I <: IsIterableOnce[Repr]](coll: Repr, it: I) {
  final def filterMap[B, That](f: it.A => Option[B])(implicit bf: BuildFrom[Repr, B, That]): That = {
    val b = bf.newBuilder(coll)
    for(e <- it(coll).iterator) f(e) foreach (b +=)
    b.result()
  }
}
implicit def filterMap[Repr](coll: Repr)(implicit it: IsIterableOnce[Repr]): FilterMapImpl[Repr, it.type] =
  new FilterMapImpl(coll, it)

List(1, 2, 3, 4, 5) filterMap (i => if(i % 2 == 0) Some(i) else None)
// == List(2, 4)
С момента

2.10

тракт IsIterableOnceLowPriority extends AnyRef

тракт IsMap[Repr] extends IsIterable[Repr]

Тип класса, свидетельствующий о том, что тип коллекции Repr имеет ключи типа K, значения типа V и имеет преобразование в MapOps[K, V, Iterable, C], для некоторых типов K, V и C.

Этот тип позволяет просто обогатить Map расширяющими методами.

Repr

Тип коллекции (например, Map[Int, String])

См. также

scala.collection.generic.IsIterable

тракт IsSeq[Repr] extends IsIterable[Repr]

Тип-класс, свидетельствующий, что тип представления коллекции Repr имеет элементы типа A и имеет преобразование к SeqOps[A, Iterable, C], для некоторых типов A и C.

Этот тип позволяет просто обогатить Seq методами расширения, которые могут в полной мере использовать механику фреймворка Scala collections в своей реализации.

См. также

scala.collection.generic.IsIterable

Члены-значения

объект IsIterable extends IsIterableLowPriority

объект IsIterableOnce extends IsIterableOnceLowPriority

объект IsMap

объект IsSeq

© 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/collection/generic/index.html

Spec-Zone.ru

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