2017-10-05 92 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

我認爲這不是現在的建議,但我不會爲scalac團隊發言。作爲個人觀點,我希望看到從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),那麼產生的未來將是包含NoSuchElementExceptionFailure

除了這些選項,您需要警衛。我沒有看到任何語法上較短的表達方式。

+0

如果我需要在可應用的Future結果的情況下做某些事情,但是如果我需要從函數返回一些映射的Future,則不適用第一種變體。我對嗎? –

+0

@AndriiAbramov如果我理解正確,是的。因爲這兩個變種都不會回到原來的未來。 –