Ah! Ora your other question ha un po 'più senso. Non sei ancora sicuro di cosa stia facendo per creare questo elenco misto Unit
/Tuple2
.
Questo dovrebbe funzionare:
List((),(), (3,4)).collect { case [email protected](_: Int, _: Int) => t }.toMap
Si noti che sto usando qui variable binding (vincolante la partita per t
) per restituire la stessa istanza Tuple2 abbiamo fatto coincidere piuttosto che crearne uno nuovo.
Utilizzando collect
si converte il tipo di vostra lista List[Any]
-List[(Int, Int)]
, che è quello che vuole toMap
dal momento che è in attesa di qualche List[(A,B)]
.
Nota: Anche se questa risposta dovrebbe funzionare per voi, penso ancora che il vostro disegno è viziata. Faresti meglio a correggere il difetto di progettazione sottostante piuttosto che trattare i sintomi in questo modo.
Sembra che questo sarebbe adatto per l'utilizzo di Scala's Option
type. In questo caso, il tuo elenco di campioni diventerebbe List(None, None, Some((3,4)))
, o potresti scriverlo come List(None, None, Some(3->4))
per la leggibilità (parentesi annidata come quella che può generare confusione).
Se si utilizza Option
quindi il tipo della vostra lista diventa List[Option[(Int, Int)]]
, che dovrebbe essere molto più bello da affrontare che un List[Any]
. Per sbarazzarsi dei None
voci e ottenere il desiderato List[(Int,Int)]
si può chiamare flatten
:
List(None, None, Some(3->4)).flatten
// res0: List[(Int, Int)] = List((3,4))
List(None, None, Some(3->4)).flatten.toMap
// res1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4)
Tuttavia, sarebbe ancora meglio se si può evitare di mettere le None
voci presenti nell'elenco nella prima posto.Se stai producendo questo elenco usando Scala per la comprensione, potresti use a guard in your for expression rimuovere gli elementi non validi dall'output.
Grazie per aver ricordato il mio progetto imperfetto. Sto usando 'None''sb/c, quando si usa un'espressione for per iterare su un' List [JsObject] ', ho bisogno di restituire un campo (credo) come parte del' yield di for-expression (.. .'). Il mio codice assomiglia a: 'for {jsObj <- jsonObjs; val x = ... 'dove il tipo di ritorno è' List [Option (String, JsValue)] '. È possibile "saltare" i valori in un'espressione for? Per i valori che ho bisogno di saltare, restituisco 'None'. –
@Kevin - Sì, è possibile saltare i valori. Questo è ciò di cui parlava il mio commento sull'uso di una guardia nella comprensione. Leggi gli esempi sul blog a cui mi sono collegato e dovrebbe essere chiaro come farlo. A proposito, ho avuto problemi simili la prima volta che stavo scrivendo a comprensione per Scala. Dopo aver appreso come sfruttare le protezioni e il tipo "Niente", ero in grado di fare molto per ripulire il mio codice! – DaoWen