scala - 将模式匹配混合到一系列映射和过滤器中

标签 scala

假设我想做类似下面的事情,我在其中操作一个 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)
  }

最佳答案

你可以用 pimp my library 模式模拟它:

  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._

最后,您的无括号管道是

  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)
  }

关于scala - 将模式匹配混合到一系列映射和过滤器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130640/

相关文章:

scala - 隐式转换导致栈溢出

java - 什么是 java.lang.ArrayIndexOutOfBoundsException : 0?

scala - 在控制台的 Scala 应用程序中排队

scala - 为什么 Scala 的类型推断不如 Haskell 强大?

scala - 使用Java API通过Scala按ID删除Elasticsearch文档

multithreading - 为什么 scala.io.Source 使用所有内核?

Scala - 复杂条件模式匹配

scala - 了解 scala 中的中缀行为

java - 卡夫卡 : What is new API for ConsumerConnector in version 0. 11

Scala 类主体或主构造函数主体