В Java, как конвертировать scala.list в java.list - PullRequest
0 голосов
/ 25 июня 2018

В Java у меня уже есть объект scala.collection.mutable.wrappedArray. Как я могу преобразовать его в util.ArrayList или util.linkedList в Java? Или, в качестве альтернативы, как я могу повторить это и сделать что-то с каждым значением этого? foreach не применимо.

1 Ответ

0 голосов
/ 25 июня 2018

Я не хочу утверждать, что "невозможно" использовать scala.collection.mutable.wrappedArray из вашего Java-кода, но, по моему мнению, если вы задаете такие вопросы, вы делаете это неправильно.

Стандартная библиотека Scala обеспечивает большую функциональность для преобразования между структурами данных Scala и структурами данных Java.

Стандартная библиотека Java не не предоставляет никаких инструментов для работыКоллекции Scala, он вообще ничего не знает о Scala.

Поэтому возникает вопрос "как я могу преобразовать scala.x.y.Z в java.r.s.T в Java " по сути бессмысленно: не пытайтесь выполнить преобразование в Java, сделайте это в Scala, это намного проще.


Общий подход

Предположим, что выесть метод foo, реализованный в Scala, который возвращает специфическую для Scala структуру данных scala.x.y.Z:

// Scala code
def foo(): scala.x.y.Z = ???

Очевидно, что вы пытаетесь сделать:

// Java code
scala.x.y.Z a = yourScalaLibrary.foo();
java.r.s.T b = /* 
  crazily complex java code
  that converts scaa.x.y.Z to java.r.s.T
*/

MyПредложение таково: просто не делай этого.Вместо этого реализуйте дополнительный специфичный для Java API в Scala :

// Scala code
def javaFoo(): java.r.s.T = {
  scala.x.y.Z a = foo()
  java.r.s.T b = /* simple conversion code using Scala-Java interop */
  b  // return Java-specific collection
}

, а затем используйте только Java-API в своем коде Java:

// Java code
java.r.s.T b = javaFoo();

Конкретный пример

Предполагая, что вы хотите использовать этот метод из Java:

def foo(): scala.collection.mutable.WrappedArray[Int] = Array(1, 2, 3)

вы сначала реализуете Java-API (в Scala!):

import collection.JavaConverters._
def javaFoo(): java.util.List[Int] = foo().asJava

и затем использовать его из Java:

java.util.List myList = javaFoo();
...