2017-10-05 13 views
3

Disons que, je l'extrait de code de code suivant:Scala: simplifier la comparaison avec le cas

val num = Future.successful(10) 

num map { 
    case n if n > 0 => // do something 
    case _    // do something 
} 

Ma question est: puis-je simplifier case n if n > 0 en quelque sorte?

Je m'y attendais, je peux écrire quelque chose comme:

case _ > 0 => // do something 

ou avec le type explicitement spécifié (même si nous savons que Future a déduit le type [Int]):

case _: Int > 0 => // do something 

ce code peut être simplifiée en quelque sorte ?

Répondre

2

Vous ne pouvez pas simplifier case n if n > 0 => ....

Chaque clause de cas dans une correspondance de motif doit avoir un motif et (éventuellement) un garde.

La syntaxe à laquelle vous faites référence (_ > 0) n'est valide que dans lambdas, mais il n'y a pas de syntaxe spéciale similaire pour les clauses case.

+0

Pensez-vous qu'il soit possible de l'introduire dans les nouvelles versions de Scala? –

+0

Je ne pense pas que ce soit une proposition pour l'instant, mais je ne parle pas pour l'équipe Scalac. En tant qu'opinion personnelle, j'aimerais que la syntaxe spéciale soit supprimée de Scala plutôt que ajoutée. –

+1

Merci, Gabriele. Tout ce que je voulais, c'est m'assurer qu'il n'y a aucun moyen de le simplifier. –

2

Si vous souhaitez simplifier la garde, vous pouvez filtrer les Future a priori:

val num = Future.successful(10).filter(_ > 0).map { nat => 
} 

Sinon, vous pouvez garder la garde et utiliser Future.collect:

val num = Future.successful(10).collect { 
    case n if n > 0 => // do something 
} 

Une chose importante à noter est que si la fonction partielle n'est pas définie pour la valeur renvoyée (c'est-à-dire pour votre cas -1), le futur résultant sera un Failure contenant un NoSuchElementException.

En plus de ces options, vous aurez besoin de la protection. Je ne vois aucune façon syntaxiquement plus courte de l'exprimer.

+0

La première variante est applicable si j'ai besoin de faire quelque chose en cas de résultat futur applicable, mais pas si j'ai besoin de retourner un futur mappé de la fonction. Ai-je raison? –

+0

@AndriiAbramov Si je vous comprends bien, oui. Puisque ces deux variantes ne retourneront pas le futur original. –