Ich arbeite häufig mit Listen, Seqs und Iteratoren von Tupeln und möchte Folgendes tun:
val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
Der Compiler scheint dieser Syntax jedoch niemals zuzustimmen. Stattdessen schreibe ich am Ende,
arrayOfTuples.map {
t =>
val e1 = t._1
val e2 = t._2
e1.toString + e2
}
Welches ist nur dumm. Wie kann ich das umgehen?
Ich mag die Tupelfunktion; Es ist sowohl praktisch als auch nicht zuletzt typsicher:
import Function.tupled arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
quelle
Warum benutzt du nicht?
Wenn Sie die Parameter mehrmals oder in anderer Reihenfolge oder in einer verschachtelten Struktur benötigen, in der _ nicht funktioniert,
arrayOfTuples map {case (i, s) => i.toString + s}
scheint eine kurze, aber lesbare Form zu sein.
quelle
_.toString + _
und er verständlichere Namen alst._1
und manipulieren möchtet._2
.arrayOfTuples map {case (i, s) => i.toString + s}
ist das natürlich praktischer. Sie sollten jedoch die Frage stellen, die Sie haben, um die Antwort zu erhalten, die Sie benötigen. :)Int + String
Zuordnung benötigen . ;)Eine andere Option ist
arrayOfTuples.map { t => val (e1,e2) = t e1.toString + e2 }
quelle
Beachten Sie, dass mit
Dotty
(Foundation ofScala 3
) das Auflösen von Parametern erweitert wurde, um eine solche Syntax zu ermöglichen:// val tuples = List((1, "Two"), (3, "Four")) tuples.map(_.toString + _) // List[String] = List("1Two", "3Four")
wobei sich jeder
_
auf den zugehörigen Tupelteil bezieht.quelle
Ich denke zum Verständnis ist hier die natürlichste Lösung:
for ((e1, e2) <- arrayOfTuples) yield { e1.toString + e2 }
quelle