使用scala合成糖来收集案例和

时间:2018-04-30 22:13:45

标签: scala

我对Scala相对较新,并且我正在尝试更新我的一些代码,但我对如何最好地利用Scala的功能有点困惑。语法糖做我想做的事。

以下是我所拥有的简化示例:

def someFunction(searchItem: String, items: Set[SomeType1]): Set[SomeType2] = 
   items.collect {
      case SomeType1(_, someFieldA, _, importantField1, importantField2, _, someSet)
         if someFieldA == searchItem && importField1 == somethingElse => 
            // do some filtering and mapping
            someSet.filter(x => x.something....)
                   .map { t => SomeType2(.....) }

但是我希望能够在case语句中添加“else”语句并遇到问题:

def someFunction(searchItem: String, items: Set[SomeType1]): Set[SomeType2] = 
   items.collect {
      case SomeType1(_, someFieldA, _, importantField1, importantField2, _, someSet)
         if someFieldA == searchItem && importField1 == somethingElse => 
            // do some filtering and mapping
            someSet.filter(x => x.something....)
                   .map { t => SomeType2(.....) }
         else if someFieldA == somethingElse || someSet.contains("foo") => 
            someSet.filter(x => x.something....)
                   .map { t => SomeType2(.....) }

但是如果在那里(它在if块中它需要一个}。之后它就不会用那个编译...

还有其他方法可以做这样的事吗?

1 个答案:

答案 0 :(得分:1)

不能以这种方式完成,因为在模式匹配中if是一个“保护”条件。不能添加else子句。

以下是您所追求的内容:

def someFunction(searchItem: String, items: Set[SomeType1]): Set[SomeType2] = 
  items.collect {

    case SomeType1(_, someFieldA, _, importantField1, importantField2, _, someSet)
      if someFieldA == searchItem && importField1 == somethingElse => 
            // do some filtering and mapping
            someSet.filter(x => x.something....)
                   .map { t => SomeType2(.....) }

    case SomeType1(_, someFieldA, _, importantField1, importantField2, _, someSet)
      if someFieldA == somethingElse || someSet.contains("foo") => 
            someSet.filter(x => x.something....)
                   .map { t => SomeType2(.....) }
  }

仅当第一个失败时才会尝试第二个case模式。