Пакет 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]
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. Этот маркер добавляется к степерам, которые поддерживают разделение и, следовательно, эффективную параллельную обработку.
Доступны следующие расширяющие методы:
Тип коллекции |
Расширяющие методы |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Strings |
|
Потоки Java |
|
Метод 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
Аккумуляторы — это изменяемые последовательности с двумя отличительными особенностями:
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.