Преобразование из scala.collection.Seq‹String› в java.util.List‹String› в коде Java

Я вызываю метод Scala из Java. И мне нужно сделать преобразование из Seq в List.

Я не могу изменить сигнатуру метода Scala, поэтому не могу использовать метод asJavaCollection из scala.collection.JavaConversions._

Любые идеи о том, как я могу этого добиться?

Использование Скала 2.9.3


person Cacho Santa    schedule 19.07.2013    source источник


Ответы (4)


Вы на правильном пути, используя JavaConversions, но для этого конкретного преобразования вам нужен метод seqAsJavaList:

java.util.List<String> convert(scala.collection.Seq<String> seq) {
    return scala.collection.JavaConversions.seqAsJavaList(seq);
}

Обновление: JavaConversions устарело, но ту же функцию можно найти в JavaConverters.

java.util.List<String> convert(scala.collection.Seq<String> seq) {
    return scala.collection.JavaConverters.seqAsJavaList(seq);
}
person Chris Martin    schedule 19.07.2013
comment
Я не могу импортировать scala.collection.JavaConversions в eclipse. здесь показывает ошибку - person Ashish Ratan; 20.03.2014
comment
Не уверен, что это новое или нет, но мне пришлось сделать seqAsJavaList(seq).asJava, чтобы получить настоящую List<E>. - person grinch; 04.03.2015
comment
Просто добавил анонимное редактирование в этот момент, чтобы использовать новый класс JavaConverters (начиная с версии 2.8.1). Надеюсь, одобрят. - person Decoded; 20.04.2019
comment
@Decoded: Спасибо за улучшение :) Я не принял редактирование как есть, потому что хотел, чтобы ответ все еще имел смысл в контексте вопроса, но я добавил поправку, в которой используется JavaConverters. - person Chris Martin; 21.04.2019
comment
Спасибо! Люблю быть на переднем крае :D - person Decoded; 21.04.2019

Начиная со Scala 2.9, вы не должны использовать имплициты из JavaConversions, так как они устарели и скоро будут удалены. Вместо этого, чтобы преобразовать Seq в java List, используйте пакет convert, подобный этому (хотя это выглядит не очень красиво):

import scala.collection.convert.WrapAsJava$;

public class Test {
    java.util.List<String> convert(scala.collection.Seq<String> seq) {
        return WrapAsJava$.MODULE$.seqAsJavaList(seq);
    }
}
person 4lex1v    schedule 19.07.2013
comment
Для scala может быть хорошей идеей предоставить более дружественный к Java набор интерфейсных методов для таких преобразований. - person Rüdiger Klaehn; 19.07.2013

Начиная с версии 2.12 это рекомендуемый способ:

public static <T> java.util.List<T> convert(scala.collection.Seq<T> seq) {
    return scala.collection.JavaConverters.seqAsJavaList(seq);
}

Все остальные методы @deprecated("use JavaConverters or consider ToJavaImplicits", since="2.12.0")

person berezovskyi    schedule 18.07.2017

(Если вы хотите сделать это преобразование в коде Scala)

Вы можете использовать JavaConverters, чтобы сделать это действительно простым.

import collection.JavaConverters._
val s: Seq[String] = ...
val list: java.util.List<String> = s.asJava
person rasen58    schedule 01.08.2017
comment
Вопрос требует преобразования в коде Java, а не в коде Scala. - person Tom Wang; 11.08.2017
comment
Ах, моя ошибка, я знал, что мне показалось странным, что никто еще не предложил это решение - теперь это имеет смысл. - person rasen58; 11.08.2017