- Perché vengono usate le parentesi graffe, non le parentesi del metodo normale?
Alcune persone preferiscono utilizzare le parentesi graffe quando il parametro è una funzione anonima. Per prima cosa, le parentesi graffe consentono pattern matching funzioni anonime, mentre la parentesi non lo fanno. In questo particolare esempio, non c'è bisogno di parentesi graffe.
Ecco un esempio in cui sono richieste parentesi graffe (a causa della corrispondenza case
modello):
def dotProd(v1:Row, v2:Row) =
v1.zip(v2).map{ case (a, b) => a * b }.reduceLeft(_ + _)
noti che la funzione sopra compie la stessa cosa come quella in questione, in modo leggermente diverso.
No, è un parametro. Proprio come v1
e v2
sono parametri per dotProd
, t
è un parametro per la funzione anonima passata a map
.
Metodi su t
. Il parametro t
è stata definita come una tupla (in particolare, Tuple2[Double, Double]
, che può essere scritta come (Double, Double)
), e tuple permetterà di estrarre ogni membro della tupla con i metodi del genere: _1
, _2
, _3
, ecc
A Tuple2
ha solo _1
e _2
, naturalmente. Si noti che il primo parametro è _1
, non _0
, a causa dell'influenza di altri linguaggi funzionali.
In ogni caso, il metodo zip
convertirà (List[Double]
) in un List[(Double, Double)]
. Il metodo map
accetta una funzione che converte gli elementi della lista (che sono le tuple (Double, Double)
) in qualcos'altro.
Sono '._1' e' ._2' veramente metodi di 'Tuple2'? Sapevo che erano campi (come in 'TupleN' avremo i campi' N' da '_1' a' _N', ognuno di qualche tipo 'Ti'. –
@TamoghnaChowdhury Certo, sono metodi. campi attraverso i metodi, a meno che non siano dichiarati come 'private [this]'. –
Oops .Sei assolutamente corretto.Le proprietà trasparenti tendono a confondere le persone usate per gli espliciti accessor/mutator in Java, come me: P. Grazie per avermelo ricordato di nuovo , anche se... –