Je suis nouveau sur Scala et je suis accro au mélange de listes Java et Scala. Je pense que les gens qui écrivent habituellement Java et qui sont nouveaux dans Scala peuvent en être dépendants, je vais donc partager la cause et la solution.
Je souhaite extraire uniquement les informations nécessaires de la liste des tweets renvoyés par l'API Twitter4J (ResponseList [Status]) et obtenir une liste de mon propre type de Tweet de classe. En Java, vous pouvez le tuer instantanément en utilisant l'API Stream.
La ResponseList renvoyée par l'API Twitter4J peut utiliser l'API Stream, elle ressemble donc à ceci lorsqu'elle est écrite dans le style Java.
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) //Pour une raison quelconque, il y a une erreur de compilation ici ...
L'opération d'arrêt de l'API Stream .collect (Collectors.toList)
retourne java.util.List, mais le type de variable à stocker est le type List de Scala.
Scala peut utiliser à la fois l'API Scala et l'API Java, mais elles sont différentes. Les deux types d'offres portent le même nom, mais ne les confondez pas.
Le plus facile.
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)
Cependant, si la méthode renvoie les tweets variables, la liste de Scala est bonne, car c'est Scala.
Selon la documentation Scala (https://docs.scala-lang.org/en/overviews/collections/conversions-between-java-and-scala-collections.html), les collections Scala et Java sont converties l'une à l'autre. Il semble que cela puisse être fait.
//La classe JavaConverters est responsable de la conversion des collections
import scala.collection.JavaConverters._
val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
val tweets: List[Tweet] = statuses
//ResponseList(Java) => mutable.Buffer(Scala)
.asScala
//Ensuite, utilisez l'API d'opération de collecte Scala
.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 |
Après avoir déclaré ʻimport collection.JavaConverters._, il est possible de convertir en utilisant la méthode ʻasJava
et la méthode ʻasScala`. Cependant, il semble qu'il ne soit pas polyvalent, veuillez donc l'utiliser avec précaution. Pour plus d'informations, voir Documents officiels
Documentation Scala Conversion de collections entre JAVA et SCALA
Recommended Posts