我有一个由其他人编写的代码。你能帮我理解这段代码吗?
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
}
}
答案 0 :(得分:2)
Scalas List[+T]
是一个抽象类,由两个具体类实现:
Nil
- 代表空名单Cons
(::
) - 代表head
类型为T
且tail
类型为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)
表示“如果head
和tail
都是非空的”。匹配后的谓词基本上会查看存储在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.html 和 http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html
它基本上包含一个日期列表:LocalDate和code:String。 如果此列表为空或包含一个元素,则返回空列表。 如果以上两者都不适用,则查看列表的前两个元素,我们将其称为y和z。如果y是在(z的日期 - 2年)之后且y和z的代码相同,则返回y和z的列表。