Поиск…


Преобразование коллекций Scala в коллекции Java и наоборот

Когда вам нужно передать коллекцию в Java-метод:

import scala.collection.JavaConverters._

val scalaList = List(1, 2, 3)
JavaLibrary.process(scalaList.asJava)

Если Java-код возвращает коллекцию Java, вы можете превратить ее в коллекцию Scala аналогичным образом:

import scala.collection.JavaConverters._

val javaCollection = JavaLibrary.getList
val scalaCollection = javaCollection.asScala

Обратите внимание, что это декораторы, поэтому они просто обертывают базовые коллекции в интерфейсе коллекции Scala или Java. Поэтому вызовы .asJava и .asScala не копируют коллекции.

Массивы

Массивы являются регулярными массивами JVM с завихрением, что они рассматриваются как инвариантные и имеют специальные конструкторы и неявные преобразования. Постройте их без new ключевого слова.

 val a = Array("element")

Теперь a имеет тип Array[String] .

 val acs: Array[CharSequence] = a
 //Error: type mismatch;  found   : Array[String]  required: Array[CharSequence]

Хотя String конвертируется в CharSequence , Array[String] не конвертируется в Array[CharSequence] .

Вы можете использовать Array как и другие коллекции, благодаря неявному преобразованию в TraversableLike ArrayOps :

 val b: Array[Int] = a.map(_.length)

Большинство коллекций Scala ( TraversableOnce ) имеют метод toArray который использует неявный ClassTag для построения массива результатов:

 List(0).toArray
 //> res1: Array[Int] = Array(0)

Это упрощает использование любого TraversableOnce в вашем коде Scala, а затем передает его в Java-код, который ожидает массив.

Преобразования типа Scala и Java

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

Преобразования следующего типа являются двунаправленными.

Тип Scala Тип Java
Итератор java.util.Iterator
Итератор java.util.Enumeration
Итератор java.util.Iterable
Итератор java.util.Collection
mutable.Buffer java.util.List
mutable.Set java.util.Set
mutable.Map java.util.Map
mutable.ConcurrentMap java.util.concurrent.ConcurrentMap

Некоторые другие коллекции Scala также могут быть преобразованы в Java, но не имеют преобразования обратно к исходному типу Scala:

Тип Scala Тип Java
Seq java.util.List
mutable.Seq java.util.List
Задавать java.util.Set
карта java.util.Map

Ссылка :

Конверсии между Java и коллекциями Scala

Функциональные интерфейсы для функций Scala - scala-java8-compat

Комплект совместимости Java 8 для Scala.

Большинство примеров копируются из Readme

Преобразователи между scala.FunctionN и java.util.function

import java.util.function._
import scala.compat.java8.FunctionConverters._

val foo: Int => Boolean = i => i > 7
def testBig(ip: IntPredicate) = ip.test(9)
println(testBig(foo.asJava))  // Prints true

val bar = new UnaryOperator[String]{ def apply(s: String) = s.reverse }
List("cod", "herring").map(bar.asScala)    // List("doc", "gnirrih")

def testA[A](p: Predicate[A])(a: A) = p.test(a)
println(testA(asJavaPredicate(foo))(4))  // Prints false

Преобразователи между классами scala.Option и java.util Необязательный, НеобязательныйДвойный, НеобязательныйInt и НеобязательныйЛог.

import scala.compat.java8.OptionConverters._

    class Test {
      val o = Option(2.7)
      val oj = o.asJava        // Optional[Double]
      val ojd = o.asPrimitive  // OptionalDouble
      val ojds = ojd.asScala   // Option(2.7) again
    }

Преобразователи из коллекций Scala в потоки Java 8

import java.util.stream.IntStream

import scala.compat.java8.StreamConverters._
import scala.compat.java8.collectionImpl.{Accumulator, LongAccumulator}


  val m = collection.immutable.HashMap("fish" -> 2, "bird" -> 4)
  val parStream: IntStream = m.parValueStream
  val s: Int = parStream.sum
  // 6, potientially computed in parallel
  val t: List[String] = m.seqKeyStream.toScala[List]
  // List("fish", "bird")
  val a: Accumulator[(String, Int)] = m.accumulate // Accumulator[(String, Int)]

  val n = a.stepper.fold(0)(_ + _._1.length) +
    a.parStream.count // 8 + 2 = 10

  val b: LongAccumulator = java.util.Arrays.stream(Array(2L, 3L, 4L)).accumulate
  // LongAccumulator
  val l: List[Long] = b.to[List] // List(2L, 3L, 4L)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow