2014-06-09 39 views
3

假設我想做類似以下的事情,其中​​我操縱一個scala列表,然後執行匹配轉換爲選項。有沒有一種方法可以在不添加括號的情況下繼續下去(更復雜的例子,嵌套括號可能會讓人困惑)?混合模式匹配到地圖和過濾器鏈中

def foo: Option[Int] = { 
    MyUtils.myListOfFoo 
     .flatMap(_.barList) 
     .filter(_.isGood) 
     .toList match { 
     case List(bar) => Some(addr) 
     case _   => None 
     } 
     .map(_.getBaz) // would like to do something like this w/o adding parens 
     .map(_.numBlah) 
    } 
+0

我沒有嘗試複製這個(與真正的類型),但簡單地刪除'match'關鍵字應該這樣做。 –

+0

除非我誤解了這個建議,否則它似乎不適用於我。 – jonderry

+0

你可以把'match'想象成一種超低優先​​級的運算符,這意味着你在這裏運氣不好。 –

回答

-1

我的意思是這樣的(我是錯的只是移除match,你必須使用map

def foo: Option[Int] = { 
    MyUtils.myListOfFoo 
     .flatMap(_.barList) 
     .filter(_.isGood) 
     .toList map { 
     case List(bar) => Some(addr) 
     case _   => None 
     } 
     .map(_.getBaz) // would like to do something like this w/o adding parens 
     .map(_.numBlah) 
    } 

我提出了這個節骨眼上檢查出來:

scala> List(1, 4, 9, 16, 25, 36, 49) 
.map (_ * 2) 
.map (_/2) 
.map { case i if i % 2 == 0 => i/2 
     case i if i % 3 == 0 => i/3 
     case i => i * i } 
res0: List[Int] = List(1, 2, 3, 8, 625, 18, 2401) 

最後,您正在構建的計算類型最好是用理解來完成。

+1

'map'不是正確的行爲。這就是將匹配應用到列表中的所有成員,當我試圖在某種意義上做的是聲明只有一個列表成員。 – jonderry

+0

所以試試吧。但是,您可能需要對「恰好一個」標準進行某種預測。 –

+0

如果你想舉一個沒有完全爲你定義的名字的例子(並且給出了輸入和期望的輸出),我至少可以試着給你想要的東西。如果是你倒票的話,我認爲在這種情況下這有點粗魯。 –

1

您可以用皮條客模擬它我的圖書館模式:

object MyUtils { 

    implicit class ListOpts[A](val l: List[A]) extends AnyVal { 
     def myMatch[B](pf: PartialFunction[List[A], Option[B]]): Option[B] = 
     pf.applyOrElse(l, (_: List[A]) => None) 
     } 

    ... 
    } 

然後在範圍上導入

import MyUtils._ 

最後,您parensless管道

def foo: Option[Int] = { 
    myListOfFoo // imported 
     .flatMap(_.barList) 
     .filter(_.isGood) 
     .toList // Not needed as filter already returns a List 
     .myMatch { // resolved implicitly 
     case List(bar) => Some(addr) 
     case _   => None // Not needed as it's handled by myMatch 
     } 
     .map(_.getBaz) // would like to do something like this w/o adding parens. Now you can :-) 
     .map(_.numBlah) 
    } 
相關問題