Spec-Zone.ru › Scala 2.13 Library

Пакет scala.jdk

пакет jdk

Члены пакета

пакетjavaapi

Типовые члены

абстрактный класс Accumulator[A, +CC[X] <: collection.mutable.Seq[X], +C <: collection.mutable.Seq[A]] extends collection.mutable.Seq[A] with Builder[A, C]

Аккумуляторы — это изменяемые последовательности с двумя отличительными особенностями:

  • Аккумулятор можно эффективно добавить к другому
  • Существуют вручную специализированные аккумуляторы для Int, Long и Double, которые не упаковывают элементы.

Эти две особенности делают аккумуляторы хорошим кандидатом для сбора результатов потока Java в параллельной обработке в коллекцию Scala. Метод расширения scala.collection.convert.StreamExtensions.StreamHasToScala.toScala для потоков Java (доступен путем импорта scala.jdk.StreamConverters._) специализирован для аккумуляторов: они строятся параллельно, части объединяются эффективно.

Создание специализированных аккумуляторов обрабатывается прозрачно. Как пользователь, использование объекта Accumulator в качестве фабрики автоматически создает IntAccumulator, LongAccumulator, DoubleAccumulator или AnyAccumulator в зависимости от типа элемента.

Примечание: чтобы запустить пример, запустите Scala REPL с scala -Yrepl-class-based для предотвращения тупиков, см. https://github.com/scala/bug/issues/9076.

scala> import scala.jdk.StreamConverters._
import scala.jdk.StreamConverters._

scala> def isPrime(n: Int): Boolean = !(2 +: (3 to Math.sqrt(n).toInt by 2) exists (n % _ == 0))
isPrime: (n: Int)Boolean

scala> val intAcc = (1 to 10000).asJavaParStream.filter(isPrime).toScala(scala.jdk.Accumulator)
intAcc: scala.jdk.IntAccumulator = IntAccumulator(1, 3, 5, 7, 11, 13, 17, 19, ...

scala> val stringAcc = (1 to 100).asJavaParStream.mapToObj("<>" * _).toScala(Accumulator)
stringAcc: scala.jdk.AnyAccumulator[String] = AnyAccumulator(<>, <><>, <><><>, ...

Существует две возможности для обработки элементов примитивного аккумулятора без упаковки: специализированные операции аккумулятора или интерфейс Stepper. Наиболее распространенные операции над коллекциями перегружены или переопределены в классах примитивных аккумуляторов, например, IntAccumulator.map или IntAccumulator.exists. Благодаря специализации функций Scala, intAcc.exists(x => testOn(x)) не влечет за собой упаковку.

Интерфейс Stepper предоставляет методы типа итератора hasStep и nextStep, и специализирован для Int, Long и Double. Метод intAccumulator.stepper создает scala.collection.IntStepper, который возвращает элементы аккумулятора без упаковки.

Аккумуляторы могут содержать более чем Int.MaxValue элементов. У них есть метод sizeLong, который возвращает размер как Long. Обратите внимание, что некоторые операции, определенные в scala.collection.Seq, реализуются с использованием length, поэтому они не будут работать правильно для больших аккумуляторов.

Класс Accumulator является базовым классом для совместного использования кода между AnyAccumulator (для ссылочных типов) и ручными специализациями IntAccumulator, LongAccumulator и DoubleAccumulator.

final класс AnyAccumulator[A] extends Accumulator[A, AnyAccumulator, AnyAccumulator[A]] with SeqOps[A, AnyAccumulator, AnyAccumulator[A]] with IterableFactoryDefaults[A, AnyAccumulator] with Serializable

final класс DoubleAccumulator extends Accumulator[Double, AnyAccumulator, DoubleAccumulator] with SeqOps[Double, AnyAccumulator, DoubleAccumulator] with Serializable

final класс IntAccumulator extends Accumulator[Int, AnyAccumulator, IntAccumulator] with SeqOps[Int, AnyAccumulator, IntAccumulator] with Serializable

final класс LongAccumulator extends Accumulator[Long, AnyAccumulator, LongAccumulator] with SeqOps[Long, AnyAccumulator, LongAccumulator] with Serializable

sealed abstract класс OptionShape[A, O] extends AnyRef

Класс-тип, реализующий преобразования из универсального Scala Option или Java Optional в специализированный Java вариант (для Double, Int и Long).

A

примитивный тип, заключённый в опцию

O

специализированный Java Optional, содержащий элемент типа A

Аннотации
@implicitNotFound("Нет специализированного типа Optional для элементов типа ${A}")

тракт Priority0FunctionExtensions extends Priority1FunctionExtensions

тракт Priority1FunctionExtensions extends Priority2FunctionExtensions

тракт Priority2FunctionExtensions extends Priority3FunctionExtensions

тракт Priority3FunctionExtensions extends AnyRef

Члены значений

объект Accumulator

Содержит методы-фабрики для построения накопителей.

Обратите внимание, что сам объект Accumulator не является фабрикой, но он неявно преобразуется в фабрику в соответствии с типом элемента, см. Accumulator.toFactory.

Это позволяет передавать объект Accumulator в качестве аргумента, когда требуется коллекция.Фабрика, и используется неявный экземпляр Accumulator.AccumulatorFactoryShape, чтобы создать специализированный накопитель в соответствии с типом элемента:

scala> val intAcc = Accumulator(1,2,3)
intAcc: scala.collection.convert.IntAccumulator = IntAccumulator(1, 2, 3)

scala> val anyAccc = Accumulator("K")
anyAccc: scala.collection.convert.AnyAccumulator[String] = AnyAccumulator(K)

scala> val intAcc2 = List(1,2,3).to(Accumulator)
intAcc2: scala.jdk.IntAccumulator = IntAccumulator(1, 2, 3)

scala> val anyAcc2 = List("K").to(Accumulator)
anyAcc2: scala.jdk.AnyAccumulator[String] = AnyAccumulator(K)

объект AnyAccumulator extends SeqFactory[AnyAccumulator]

объект CollectionConverters extends AsJavaExtensions with AsScalaExtensions

Этот объект предоставляет методы расширения для преобразования между коллекциями Scala и Java.

При написании кода Java используйте явные методы преобразования, определенные в javaapi.CollectionConverters.

Примечание: для создания потоков Java, которые работают с коллекциями Scala (последовательно или параллельно), используйте StreamConverters.

import scala.jdk.CollectionConverters._
val s: java.util.Set[String] = Set("one", "two").asJava

Преобразования возвращают адаптеры для соответствующего API, т. е. коллекции оборачиваются, а не преобразуются. Изменения в исходной коллекции отражаются в представлении и наоборот:

scala> import scala.jdk.CollectionConverters._

scala> val s = collection.mutable.Set("one")
s: scala.collection.mutable.Set[String] = HashSet(one)

scala> val js = s.asJava
js: java.util.Set[String] = [one]

scala> js.add("two")

scala> s
res2: scala.collection.mutable.Set[String] = HashSet(two, one)

Следующие преобразования поддерживаются через asScala и asJava.

scala.collection.Iterable       <=> java.lang.Iterable
scala.collection.Iterator       <=> java.util.Iterator
scala.collection.mutable.Buffer <=> java.util.List
scala.collection.mutable.Set    <=> java.util.Set
scala.collection.mutable.Map    <=> java.util.Map
scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap

Следующие преобразования поддерживаются через asScala и через специально названные методы расширения для преобразования в коллекции Java, как показано:

scala.collection.Iterable    <=> java.util.Collection   (via asJavaCollection)
scala.collection.Iterator    <=> java.util.Enumeration  (via asJavaEnumeration)
scala.collection.mutable.Map <=> java.util.Dictionary   (via asJavaDictionary)

Кроме того, следующие односторонние преобразования предоставляются через asJava.

scala.collection.Seq         => java.util.List
scala.collection.mutable.Seq => java.util.List
scala.collection.Set         => java.util.Set
scala.collection.Map         => java.util.Map

Следующее одностороннее преобразование предоставляется через asScala.

java.util.Properties => scala.collection.mutable.Map

Во всех случаях преобразование из исходного типа в целевой тип и обратно вернёт исходный объект. Например:

import scala.jdk.CollectionConverters._

val source = new scala.collection.mutable.ListBuffer[Int]
val target: java.util.List[Int] = source.asJava
val other: scala.collection.mutable.Buffer[Int] = target.asScala
assert(source eq other)

объект DoubleAccumulator extends SpecificIterableFactory[Double, DoubleAccumulator] with java.io.Serializable

объект DurationConverters

Этот объект предоставляет методы расширения для преобразования между типами продолжительности Scala и Java.

При написании кода Java используйте явные методы преобразования, определенные в javaapi.DurationConverters.

объект FunctionConverters extends Priority0FunctionExtensions

Этот объект предоставляет методы расширения для преобразования между типами функций Scala и Java.

При написании кода Java используйте явные методы преобразования, определенные в javaapi.FunctionConverters.

Использование метода расширения .asJava для функции Scala генерирует наиболее специфичный возможный тип функции Java:

scala> import scala.jdk.FunctionConverters._
scala> val f = (x: Int) => x + 1

scala> val jf1 = f.asJava
jf1: java.util.function.IntUnaryOperator = ...

Более общие типы функций Java можно создать, используя соответствующий метод расширения asJavaXYZ.

scala> val jf2 = f.asJavaFunction
jf2: java.util.function.Function[Int,Int] = ...

scala> val jf3 = f.asJavaUnaryOperator
jf3: java.util.function.UnaryOperator[Int] = ...

Преобразование функции Java в Scala выполняется с помощью метода расширения asScala.

scala> List(1,2,3).map(jf2.asScala)
res1: List[Int] = List(2, 3, 4)

объект FunctionWrappers

объект FutureConverters

Этот объект предоставляет методы расширения для преобразования между Scala Future и Java CompletionStage.

При написании кода Java используйте явные методы преобразования, определенные в javaapi.FutureConverters.

Обратите внимание, что мост реализован на стороне только для чтения асинхронных обработчиков, а именно Future (вместо scala.concurrent.Promise) и CompletionStage (вместо java.util.concurrent.CompletableFuture). Это сделано намеренно, поскольку семантика моста для обработчиков записи может привести к гонкам; если оба конца (CompletableFuture и Promise) завершатся независимо одновременно, они могут содержать разные значения впоследствии. По этой причине toCompletableFuture не поддерживается на созданных CompletionStage.

объект IntAccumulator extends SpecificIterableFactory[Int, IntAccumulator] with java.io.Serializable

объект LongAccumulator extends SpecificIterableFactory[Long, LongAccumulator] with java.io.Serializable

объект OptionConverters

Этот объект предоставляет расширяющие методы, которые преобразуют между типами Scala Option и Java Optional.

При написании кода Java используйте явные методы преобразования, определенные в javaapi.OptionConverters вместо этого.

Тип Scala Option расширен методом toJava, который создает соответствующий тип Optional, и методом toJavaPrimitive, который создает специализированный вариант (например, OptionalInt), если применимо.

Тип Java Optional расширен методом toScala и методом toJavaPrimitive.

Наконец, специализированные типы Optional расширены методами toScala и toJavaGeneric.

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

import scala.jdk.OptionConverters._
val a = Option("example").toJava      // Creates java.util.Optional[String] containing "example"
val b = (None: Option[String]).toJava // Creates an empty java.util.Optional[String]
val c = a.toScala                     // Back to Option("example")
val d = b.toScala                     // Back to None typed as Option[String]
val e = Option(2.7).toJava            // java.util.Optional[Double] containing boxed 2.7
val f = Option(2.7).toJavaPrimitive   // java.util.OptionalDouble containing 2.7 (not boxed)
val g = f.toScala                     // Back to Option(2.7)
val h = f.toJavaGeneric               // Same as e
val i = e.toJavaPrimitive             // Same as f

объект OptionShape

объект StreamConverters extends StreamExtensions

Этот объект предоставляет расширяющие методы для создания потоков Java, которые работают с коллекциями Scala (последовательно или параллельно). Для получения дополнительной информации о потоках Java, обратитесь к документации (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html).

При написании кода Java используйте явные методы преобразования, определенные в javaapi.StreamConverters вместо этого.

Методы asJavaSeqStream и asJavaParStream преобразуют коллекцию в поток Java:

scala> import scala.jdk.StreamConverters._

scala> val s = (1 to 10).toList.asJavaSeqStream
s: java.util.stream.IntStream = java.util.stream.IntPipeline$Head@7b1e5e55

scala> s.map(_ * 2).filter(_ > 5).toScala(List)
res1: List[Int] = List(6, 8, 10, 12, 14, 16, 18, 20)

Примечание: использование параллельных потоков в Scala REPL приводит к тупиковым ситуациям, см. https://github.com/scala/bug/issues/9076. В качестве обходного решения используйте scala -Yrepl-class-based.

scala> def isPrime(n: Int): Boolean = !(2 +: (3 to Math.sqrt(n).toInt by 2) exists (n % _ == 0))
isPrime: (n: Int)Boolean

scala> (10000 to 1000000).asJavaParStream.filter(isPrime).toScala(Vector)
res6: scala.collection.immutable.Vector[Int] = Vector(10007, 10009, 10037, 10039, ...

Поток Java Stream предоставляет операции над последовательностью элементов. Потоки создаются из Spliterator, которые похожи на Iterators с дополнительной возможностью разделять некоторые свои элементы. Это разделение, если поддерживается Spliterator, используется для паралелизации операций Stream.

Коллекции Scala имеют метод stepper, который возвращает scala.collection.Stepper для коллекции, который в свою очередь может быть преобразован в Spliterator для создания потока Java.

Расширяющий метод asJavaSeqStream доступен для любой коллекции Scala. Расширяющий метод asJavaParStream может быть вызван только для коллекций, где тип возвращаемого значения метода stepper помечен маркером scala.collection.Stepper.EfficientSplit. Этот маркер добавляется к степерам, которые поддерживают разделение и, следовательно, эффективную параллельную обработку.

Доступны следующие расширяющие методы:

Тип коллекции

Расширяющие методы

IterableOnce

asJavaSeqStream

IndexedSeq, Arrays, BitSet, Accumulator, HashMap, HashSet, Range, TreeMap, TreeSet, Vector, Strings

asJavaParStream

Map

asJavaSeqKeyStream, asJavaSeqValueStream

HashMap, TreeMap

asJavaParKeyStream, asJavaParValueStream

Stepper

asJavaSeqStream

Stepper with EfficientSplit

asJavaParStream

Strings

asJavaSeqStream, asJavaParStream, asJavaSeqCharStream, asJavaParCharStream, asJavaSeqCodePointStream, asJavaParCodePointStream

Потоки Java

toScala, asJavaPrimitiveStream

Метод asJavaPrimitiveStream преобразует Stream[Int] в IntStream. Это дуальная функция метода boxed, определенного для примитивных потоков (например, IntStream.boxed является Stream[Integer]).

Расширяющие методы toScala для потоков Java собирают результат потоковой обработки в коллекцию Scala, например, stream.toScala(List), stream.toScala(Vector). Обратите внимание, что операции преобразования над потоками ленивые (также называемые «промежуточными»), терминальные операции, такие как forEach, count или toScala, запускают вычисление.

Сбор параллельного потока в коллекцию можно выполнять параллельно. Это полезно, если целевая коллекция поддерживает эффективное объединение сегментов, созданных параллельно. Для поддержки этого случая стандартная библиотека Scala предоставляет коллекцию Accumulator. Эта коллекция поддерживает эффективное параллельное создание, и она имеет специализированные подтипы для Int, Long и Double, поэтому примитивные потоки Java можно собирать в коллекцию Scala без упаковки элементов.

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

Spec-Zone.ru

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