2012-03-05 4 views
8

voglio definire una funzione:Come convertire un Qualcuno ("") in Nessuno in una riga?

def convert(x: Option[String]): Option[String] = ... 

Quando x è Some(str) e str è vuota dopo il taglio, viene convertito in un None, altrimenti, sarà un Some con stringa tagliata.

Così, il banco di prova sarà:

convert(Some("")) == None 
convert(Some(" ")) == None 
convert(None) == None 
convert(Some(" abc ")) == Some("abc") 

posso scrivere come:

def convert(x: Option[String]): Option[String] = x match { 
    case Some(str) if str.trim()!="" => Some(str.trim()) 
    case _ => None 
} 

Ma spero di trovare un'implementazione più semplice (una riga).

+3

Hai qualche carenza di caratteri di nuova riga nel tuo ambiente? Ti viene pagato inversamente proporzionale al numero di righe che scrivi? Il mio consiglio sarebbe semplicemente di usare la versione a due linee e smettere di fare il lavoro per te :-) – paxdiablo

+1

Mi piace solo rendere il mio codice semplice e chiaro – Freewind

+1

@paxdiablo: È una domanda valida in quanto l'esempio può essere effettivamente migliorato: Il codice esegue 'str.trim' due volte che è chiaramente qualcosa da evitare. – Debilski

risposta

15

Che dire di questo:

def convert(x: Option[String]) = 
    x.map(_.trim()).filterNot(_.isEmpty()) 

UPDATE: sintassi alternative proposte dalla @JamesMoore e @PeterSchmitz:

x map {_.trim} filterNot {_.isEmpty} 
x map (_.trim) filterNot (_.isEmpty) 
+0

Siamo spiacenti, 'convert (Some (" abc "))! = Alcuni (" abc ")' – Freewind

+0

@Freewind: le mie scuse, ora dovrebbero essere corrette. –

+4

Penso che sia più facile da leggere se si rilasciano i paren: x map {\ _. Trim} filterNot {\ _. IsEmpty} –

1

E come al solito c'è anche la per la comprensione sintassi alternativa (che è uno zucchero di sintassi per filtro e mappa)

def convert(o: Option[String]): Option[String] = 
    for (x <- o if !x.isEmpty) yield x 
+1

Più simile aceto sintattico –

1

def convert (x: Opzione [stringa]) = x.filter (s => s.trim.nonEmpty)

Problemi correlati