Ich bin neu in Scala und süchtig danach, Java- und Scala-Listen zu mischen. Ich denke, dass Leute, die normalerweise Java schreiben und neu in Scala sind, süchtig danach sein können, also werde ich die Ursache und Lösung teilen.
Ich möchte nur die erforderlichen Informationen aus der Liste der von der Twitter4J-API zurückgegebenen Tweets (ResponseList [Status]) extrahieren und eine Liste meiner eigenen Klasse Tweet-Typ erhalten. In Java können Sie es mithilfe der Stream-API sofort beenden.
Die von der Twitter4J-API zurückgegebene ResponseList kann die Stream-API verwenden, sodass sie im Java-Stil so aussieht.
val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
val tweets: List[Tweet] = statuses
.stream()
.map(status => new Tweet(status.getId, status.getText, status.getUser.getName))
.collect(Collectors.toList) //Aus irgendeinem Grund liegt hier ein Kompilierungsfehler vor ...
Die Stream-API-Beendigungsoperation .collect (Collectors.toList)
gibt java.util.List zurück, aber der Typ der gespeicherten Variablen ist der Listentyp von Scala.
Scala kann sowohl die Scala-API als auch die Java-API verwenden, sie unterscheiden sich jedoch. Beide bieten Typen mit demselben Namen an, aber verwechseln Sie sie nicht.
Das einfachste.
val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
val tweets: java.util.List[Tweet] = statuses
.stream()
.map(status => new Tweet(status.getId, status.getText, status.getUser.getName))
.collect(Collectors.toList)
Wenn die Methode jedoch die variablen Tweets zurückgibt, ist Scalas Liste gut! Weil es Scala ist.
Gemäß der Scala-Dokumentation (https://docs.scala-lang.org/en/overviews/collections/conversions-between-java-and-scala-collections.html) werden Scala- und Java-Sammlungen ineinander konvertiert. Es scheint, dass es getan werden kann.
//Die JavaConverters-Klasse ist für die Konvertierung von Sammlungen verantwortlich
import scala.collection.JavaConverters._
val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
val tweets: List[Tweet] = statuses
//ResponseList(Java) => mutable.Buffer(Scala)
.asScala
//Verwenden Sie dann die Scala-Erfassungsoperations-API
.map(status => new Tweet(status.getId, status.getText, status.getUser.getName))
.toList
Scala | Java |
---|---|
Iterator | java.util.Iterator |
Iterator | java.util.Enumeration |
Iterable | java.lang.Iterable |
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 |
Nach dem Deklarieren von "import collection.JavaConverters._" ist die Konvertierung mit der Methode "asJava" und der Methode "asScala" möglich. Es scheint jedoch, dass es nicht für alle Zwecke geeignet ist. Verwenden Sie es daher vorsichtig. Weitere Informationen finden Sie unter Offizielle Dokumente.
Scala-Dokumentation Konvertieren von Sammlungen zwischen JAVA und SCALA
Recommended Posts