Scala:模式匹配代码



我有一个别人写的代码。你能帮我理解这段代码吗?

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

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

  1. Nil -表示空列表
  2. Cons (::) -表示head类型为T, tail类型为List[+T]的链表。

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

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元组中的第一个元素(它是LocalDateTime)在该时间之后,

x._2 == xs.head._2

表示"查找头(x)第二个元素,这是一个String,并将其与下一个元素,即尾(xs)第一个元素(xs.head)进行匹配,并匹配两个字符串是否相等。

最后

:

case Nil => List.empty

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

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

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

最新更新