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 => ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |