J'étais étrangement accro à l'utilisation de l'API Stream de Java avec Scala

introduction

Aperçu

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.

environnement

Chose que tu veux faire

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.

Code d'origine

code

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 ...

Cause

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.

Politique de réécriture

1. Puisqu'il n'y a aucune aide pour cela, adoptez java.util.List comme type de variable

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.

2. Convertissez la classe de collection Java en classe de collection 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

Supplément sur les convertisseurs Java

Tableau de comparaison de la collection Scala et de la collection Java

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

Comment utiliser

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

URL de référence

Documentation Scala Conversion de collections entre JAVA et SCALA

Recommended Posts

J'étais étrangement accro à l'utilisation de l'API Stream de Java avec Scala
J'étais accro à l'utilisation de RXTX avec Sierra
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'étais accro au démarrage de sbt
Ce à quoi j'étais accro en utilisant rspec sur des rails
J'ai essayé d'utiliser l'API Java8 Stream
Ce à quoi j'étais accro avec l'API REST Redmine
J'étais accro au paramètre API version min23 de registerTorchCallback
J'ai essayé d'utiliser l'API Elasticsearch en Java
Essayez d'utiliser l'API Stream en Java
J'étais accro à la réécriture sur @ SpringApplicationConfiguration-> @SpringBootTest
J'étais accro à la méthode du rouleau
J'ai essayé de résumer l'API Stream
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
[Rails] J'étais accro aux paramètres nginx lors de l'utilisation d'Action Cable.
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava
SpringSecurity J'étais accro à essayer de me connecter avec un mot de passe haché (résolu)
J'étais accro au record du modèle associé
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Je suis allé à Scala Fukuoka 2019!
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
J'étais accro à la configuration de default_url_options avec l'introduction de la conception de Rails
J'étais accro à la mise à jour de la déclaration dans MyBatis
API Java Stream en 5 minutes
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
[Java] Introduction à l'API Stream
L'histoire à laquelle j'étais accro lors de la création de STS
[Circle CI] Une histoire à laquelle j'étais accro chez Start Building
Une note quand j'étais accro à la conversion d'Ubuntu sur WSL1 en WSL2
Examinons la signification de "stream" et "collect" dans l'API Stream de Java.
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
[java8] Pour comprendre l'API Stream
[Introduction à Java] À propos de l'API Stream
J'ai essayé d'utiliser JWT en Java
Java 8 ~ Stream API ~ pour commencer maintenant
J'ai résumé les points à noter lors de l'utilisation combinée des ressources et des ressources
J'étais accro à l'idée de toucher MySQL 8.0 avec un sentiment de 5.7. Problème de configuration My.cnf
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
J'étais accro au scrollview car je ne pouvais pas appuyer sur la taille variable UIView
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'ai appelé l'analyse de la syntaxe de l'API COTOHA 100 fois en Java pour mesurer les performances.
J'étais un peu accro à la connexion ssh de mac à linux (ubuntu)
À vous à qui on a dit "Ne pas utiliser Stream API" dans le champ
Quand j'ai voulu créer une méthode pour Premium Friday, c'était déjà dans l'API standard Java 8
Traitement des données à l'aide de l'API de flux de Java 8
J'ai essayé d'utiliser l'outil de diagnostic Java Arthas
Essayez d'utiliser l'API au format JSON en Java
Classe anonyme (visant à introduire l'API de flux)
Je veux utiliser @Autowired dans Servlet
Remarques sur l'API Stream et SQL de Java
Essayez d'ajouter du texte à une image avec Scala en utilisant la bibliothèque standard de Java