我有一个别人写的代码。你能帮我理解这段代码吗?
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]
是一个抽象类,由两个具体类实现:
-
Nil
-表示空列表 -
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)
表示"如果head
和tail
都非空"。匹配之后的谓词基本上查找存储在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的列表。