Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden

Einführung

Überblick

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.

Umgebung

Was du machen willst

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.

Originalcode

Code

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

Ursache

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.

Richtlinie zum Umschreiben

1. Da es keine Hilfe dafür gibt, übernehmen Sie java.util.List als Variablentyp

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.

2. Konvertieren Sie die Java-Auflistungsklasse in die Scala-Auflistungsklasse

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

Ergänzung zu Java Converters

Vergleichstabelle der Scala-Sammlung und der Java-Sammlung

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

Wie benutzt man

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.

Referenz-URL

Scala-Dokumentation Konvertieren von Sammlungen zwischen JAVA und SCALA

Recommended Posts

Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden
Ich war süchtig nach RXTX mit Sierra
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Ich war süchtig danach, sbt zu starten
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich habe versucht, die Java8 Stream API zu verwenden
Was ich mit der Redmine REST API süchtig gemacht habe
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Versuchen Sie es mit der Stream-API in Java
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
Ich war süchtig nach der Rollmethode
Ich habe versucht, die Stream-API zusammenzufassen
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
[Rails] Ich war süchtig nach den Nginx-Einstellungen, als ich Action Cable verwendete.
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
SpringSecurity Ich war süchtig danach, mich mit einem Hash-Passwort anzumelden (gelöst)
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Ich ging zur Scala Fukuoka 2019!
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Java Stream API in 5 Minuten
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
[Java] Einführung in die Stream-API
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
[Circle CI] Eine Geschichte, der ich bei Start Building verfallen war
Ein Hinweis, als ich süchtig danach war, Ubuntu auf WSL1 in WSL2 zu konvertieren
Betrachten wir die Bedeutung von "Stream" und "Collect" in der Stream-API von Java.
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
[java8] Um die Stream-API zu verstehen
[Einführung in Java] Informationen zur Stream-API
Ich habe versucht, JWT in Java zu verwenden
Java 8 ~ Stream API ~ startet jetzt
Ich habe die Punkte zusammengefasst, die bei der kombinierten Verwendung von Ressourcen und Ressourcen zu beachten sind
Ich war süchtig danach, MySQL 8.0 mit einem 5.7-Gefühl zu berühren. My.cnf-Konfigurationsproblem
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
Probleme, denen ich beim Erstellen der Digdag-Umgebung mit Docker verfallen war
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich habe die COTOHA-API-Syntaxanalyse 100 Mal in Java aufgerufen, um die Leistung zu messen.
Ich war ein wenig süchtig nach SSH-Verbindung von Mac zu Linux (Ubuntu)
Ihnen, denen im Feld "Keine Stream-API verwenden" mitgeteilt wurde
Als ich eine Methode für Premium Friday erstellen wollte, war sie bereits in der Java 8-Standard-API enthalten
Datenverarbeitung mit der Stream-API von Java 8
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Versuchen Sie es mit der JSON-Format-API in Java
Anonyme Klasse (mit dem Ziel, Stream-API einzuführen)
Ich möchte @Autowired in Servlet verwenden
Hinweise zur Stream-API und zu SQL von Java
Versuchen Sie, mit Scala mithilfe der Standardbibliothek von Java Text zu einem Bild hinzuzufügen