2010-10-18 15 views
9

Mi piacerebbe convertire un Array[String] in un Array[Int], utilizzando il metodo mappa. Qual è il modo più breve per passare una funzione di tipo (String) => Int come argomento della mappa?Come scrivere (stringa): funzione Int?

Preferirei convertire quelli esistenti esistenti come Integer.valueOf in qualche modo. Un metodo di collegamento degli argomenti per abbreviare la costruzione come def parseInt(s:String) = Integer.parseInt(s, 10) sarebbe ottimo.

risposta

17
scala> Array("1", "2", "3") map(_.toInt) 
res4: Array[Int] = Array(1, 2, 3) 

o

scala> def parseInt(s:String) = Integer.parseInt(s, 10) 
parseInt: (s: String)Int 

scala> Array("1", "2", "3") map parseInt 
res7: Array[Int] = Array(1, 2, 3) 
+0

Che cosa significa "_" da "_.toInt"? – Basilevs

+2

È un segnaposto, equivalente a Array ("1", "2", "3") map (x => x.toInt), che significa "per ogni elemento nella matrice, applica il metodo .toInt su di esso e costruisce un nuovo array ", che si tradurrà in Array (" 1 ".toInt," 2 ".toInt," 3 ".toInt) –

+0

Questa è una buona risorsa sulla" sintassi del segnaposto "di Scala: http://books.google. co.uk/books?id=MFjNhTjeQKkC&pg=PA146&lpg=PA146&dq=scala+placeholder+syntax&source=bl&ots=FKtlWGELnw&sig=d_XC9xbr3-4Q8968ZRmzEYamsYY&hl=en&ei=I328TJyaA47KjAf24KnRDg&sa=X&oi=book_result&ct=result&resnum=3&ved=0CCAQ6AEwAg#v=onepage&q=scala%20placeholder% 20 sintassi & f = falso –

0
scala> val strs = Array("1", "2") 
strs: Array[java.lang.String] = Array(1, 2) 

scala> strs.map(_.toInt) 
res0: Array[Int] = Array(1, 2) 
3

In primo luogo, definiamo un array di stringhe:

scala> val foo = Array("1", "2", "3") 
foo: Array[java.lang.String] = Array(1, 2, 3) 

Il modo più ovvio sarebbe quello di utilizzare Scala di toInt(), disponibile su stringhe:

Definizione:

// StringLike.scala 
def toInt: Int   = java.lang.Integer.parseInt(toString) 

(Nota: toString, definita altrove, converte semplicemente l'oggetto StringLike in una stringa Java)

tuo codice:

scala> foo.map(_.toInt) 
res0: Array[Int] = Array(1, 2, 3) 

Integer.valueOf() lavora anche, a meno di notare otterrete Array[Integer] anziché Array[Int]:

scala> foo.map(Integer.valueOf) 
res1: Array[java.lang.Integer] = Array(1, 2, 3) 

Mentre noi siamo, una di comprensione avrebbe funzionato quasi altrettanto bene, tranne che devi essere invocando toInt te stesso, invece di passare sopra alla map()

scala> for (i<-foo) yield i.toInt 
res2: Array[Int] = Array(1, 2, 3) 
+0

@huynhjl mi ha battuto su di esso ... – nadavwr

2

E 'semplice come:

Array("1", "2", "3") map Integer.valueOf