2017-10-05 10 views
3

でケースを簡素化し、私は次のコードスニペットを持っている、のは、言ってみましょう:スカラ:比較

val num = Future.successful(10) 

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

私の質問は:私は何とかcase n if n > 0を簡略化することができますか?

私が何か書くことができることを期待:

case _ > 0 => // do something 

または明示的に指定されたタイプ(私たちはFutureはタイプ[Int]を推論していることを知っているが)と:

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

をこのコードは何とか簡素化することができます?

答えて

2

case n if n > 0 => ...を簡略化することはできません。

パターンマッチのすべての場合句は、パターン及び(任意に)ガードを有する必要があります。

あなたが参照している構文(_ > 0)はlambdaでのみ有効ですが、case節には同様の特別な構文はありません。

+0

Scalaの新しいバージョンにこのようなものを導入することは可能でしょうか? –

+0

私はこれも今の提案ではないと思っていますが、私はスカラクのチームでは話しません。個人的な意見として、特別な構文が追加されるのではなくScalaから削除されているのを見たいと思います。 –

+1

ありがとう、ガブリエル。私が望んでいたのは、それを単純化する方法がないことを確認することでした。 –

2

あなたはガードを簡素化したい場合は、Future先験的にフィルタをかけることができます。

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

そうでない場合、あなたはガードを維持し、Future.collectを使用することができます。

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

注意すべき重要な点その部分関数が返された値に対して定義されていない場合(すなわち、あなたのケース-1の場合)、結果として得られる未来はNoSuchElementExceptionを含むFailureになります。

これらのオプション以外は、ガードが必要です。私はそれを表現する構文的に短い方法は見ません。

+0

適用可能な未来の結果の場合に何かを行う必要がある場合は最初の変形が適用されますが、マップされた未来の関数を返す必要がある場合は適用されません。私は正しい? –

+0

@AndriiAbramovもし私があなたを正しく理解したら、はい。これらの両方の変種は元の未来を返さないからです。 –