Scala:模式匹配的代码

时间:2016-08-26 07:01:00

标签: scala pattern-matching

我有一个由其他人编写的代码。你能帮我理解这段代码吗?

 def sameCodeForTwoYears(list: List[(LocalDate, String)]):  List[(LocalDate, String)] = {
 list match {
  case x :: Nil => List.empty
  case x :: xs => if (xs.head._1.minusYears(2).isAfter(x._1) && x._2 == xs.head._2) {
    List(x, xs.head)
  } else sameCodeForTwoYears(xs)
  case Nil => List.empty
  }
}

2 个答案:

答案 0 :(得分:2)

Scalas List[+T]是一个抽象类,由两个具体类实现:

  1. Nil - 代表空名单
  2. Cons::) - 代表head类型为Ttail类型为List[+T]的链接列表。< / LI>

    你在这里看到的模式匹配基本上代表了这两个结构。我们来做个案分析:

    case x :: Nil => List.empty
    

    表示“如果head非空,且tail为空列表,则返回List.empty”,返回空列表。

    case x :: xs => if (xs.head._1.minusYears(2).isAfter(x._1) && x._2 == xs.head._2) {
    List(x, xs.head)
    

    表示“如果headtail都是非空的”。匹配后的谓词基本上会查看存储在List[(LocalDateTime, String)]内的元组,其中_1表示第一个元素,_2表示第二个元素。如果条件:

    ,我们会深入研究其含义
    xs.head._1.minusYears(2).isAfter(x._1)
    

    表示“从尾部(xs获取第一个元素,它是头部),查看元组中的第一个元素并将其减去2年。如果x s元组中的第一个元素(这是一个LocalDateTime)是在那之后。

    x._2 == xs.head._2
    

    表示“查看头部(x)第二个元素,即String,并将其与下一个元素匹配,即尾部(xs)第一个元素({ {1}})并匹配两个字符串是否相等。

    最后:

    xs.head

    表示“如果列表为空”,则返回一个空列表。

答案 1 :(得分:0)

请参阅: http://docs.scala-lang.org/tutorials/tour/pattern-matching.htmlhttp://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html

它基本上包含一个日期列表:LocalDate和code:String。 如果此列表为空或包含一个元素,则返回空列表。 如果以上两者都不适用,则查看列表的前两个元素,我们将其称为y和z。如果y是在(z的日期 - 2年)之后且y和z的代码相同,则返回y和z的列表。