2014-06-09 41 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) 
    } 
相关问题