Mam interfejs API Java, który zwraca listę, taką jak:
public List<?> getByXPath(String xpathExpr)
Używam poniższego kodu scala:
val lst = node.getByXPath(xpath)
Teraz, jeśli spróbuję cukru składniowego Scala, takiego jak:
lst.foreach{ node => ... }
to nie działa. Wyskakuje mi błąd:
value foreach is not a member of java.util.List[?0]
Wygląda na to, że muszę przekonwertować listę Java do listy Scala. Jak to zrobić w powyższym kontekście?
Odpowiedzi:
EDYCJA: Zauważ, że jest to przestarzałe od wersji 2.12.0. Użyj
JavaConverters
zamiast tego. (komentarz @Yaroslav)Od Scala 2.8 ta konwersja jest teraz wbudowana w język przy użyciu:
Pracuje.
asScala
nie działałźródło
JavaConversions
są przestarzałe od 2.12.0. UżyjJavaConverters
zamiast tego.import scala.jdk.CollectionConverters._
scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.htmlDo tego celu służy przydatny obiekt Scala - scala.collection.JavaConverters
Możesz wykonać import, a
asScala
następnie w następujący sposób:To powinno dać ci
Buffer
reprezentację Scali, która pozwoli ci to osiągnąćforeach
.źródło
Szukałem odpowiedzi napisanej w Javie i zaskakująco nie mogłem znaleźć tutaj czystych rozwiązań. Po jakimś czasie udało mi się to rozgryźć, więc postanowiłem dodać to tutaj na wypadek, gdyby ktoś inny szukał implementacji Javy (myślę, że to też działa w Scali?):
źródło
Jeśli musisz przekonwertować Javę
List<ClassA>
na ScalęList[ClassB]
, musisz wykonać następujące czynności:1) Dodaj
2) Użyj metod
asScala
,toList
a następniemap
3) Dodaj następujący kod do
ClassB
konstruktora, który otrzymujeClassA
jako parametr:źródło
Od wersji 2.8.1 scala używaj
JavaConverters._
do konwertowania kolekcji scala i Java przy użyciu metod asScala i asJava.import scala.collection.JavaConverters._
javalist.asScala
scalaSeq.asJava
zobacz stronę z dokumentacją Scala relacji konwersji
źródło
Skrót do konwersji listy java na listę scala
import scala.collection.JavaConverters._
myjavaList.asScala.toList
źródło