加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 很多嵌套匹配…模式匹配的情况

发布时间:2020-12-16 19:04:34 所属栏目:安全 来源:网络整理
导读:我有一个自动生成的Web服务客户端.我有很多复杂的类,我必须对它进行模式匹配.现在我的结构看起来像这样: val response = client.getResponseresponse match { case Left(_) = None case Right(a: SomeClass) = a match { case SomeClass2(b: Option[SomeCla
我有一个自动生成的Web服务客户端.我有很多复杂的类,我必须对它进行模式匹配.现在我的结构看起来像这样:

val response = client.getResponse
response match {
  case Left(_) => None
  case Right(a: SomeClass) => a match {

    case SomeClass2(b: Option[SomeClass3]) => b match {

      case None => None
      case Some(c: SomeClass3) => c match {

        case SomeClass4(_,_,d: Seq[SomeClass4]) => d match {
          case Nil => None

          case seq: Seq[SomeClass5] => seq match {
            case Nil => None
            case Seq(xs@_*) => xs map { x =>
              x match {
                case Nil => None

                case SomeClass6(e: SomeClass7) => e match {
                  case Nil => None

                   case SomeClass8(f,_) => f match {
                    case Nil => None
                    case Seq(xs@_*) => xs map { x => 
                      x match {

                        case Nil => None
                        case SomeClass9(g: Seq[SomeClass9],_) => /* + some nested levels more*/
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

其中SomeClass1 – SomeClass9是案例类.

如你所见,它似乎令人恐惧.我该怎么办?什么是让它看起来更好的标准方法?

我想不仅应该重构而是另一种方法.

解决方法

假设a应该是SomeClass2,而不是SomeClass(与b,c,d相同).

您可以使用替代模式,例如案例A | B => ……和像Some(MyClass(f))这样的结构模式.

你也可以在地图中使用部分函数,??例如map {case …}而不是map {x => x匹配{…}}.

我猜您的代码中存在错误:检查案例Nil => …; case SomeClass8(…)=> ….

你可以用xs替换Seq(xs @ _ *).如果您需要整个集合,则无需提取元素.

你的代码:

response match {
  case Left(_) | Right(SomeClass2(None)) | Right(SomeClass2(Some(SomeClass3(_,Nil))) => None
  case Right(SomeClass2(Some(SomeClass3(_,xs))) =>
    xs map {
      case SomeClass6(None) | SomeClass6(Some(SomeClass8(Nil,_))) => None
      case SomeClass6(Some(SomeClass8(xs,_))) =>
        xs map {
          case Nil => None
          case SomeClass9(g,_) => /* + some nested levels more*/
        }
    }
}

您还应该将嵌套匹配提取到单独的方法中.

模式匹配不是唯一的解决方案.您可以使用Either和Option的方法:

response.right.toOption.collect {
  // No need for the first part.
  case SomeClass2(Some(SomeClass3(_,xs)) if xs.nonEmpty => ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读