首页 > 解决方案 > 如何从 scala 中的函数返回新列表?

问题描述

出于教育目的,我想实现一个过滤器函数,它接受一个像 (_ > 4) 这样的过滤器和一个列表作为参数。它应该返回过滤后的列表。基本上它应该和已经可用的 list.filter 函数一样,但我想自己实现它。问题是如何从函数中创建一个新列表。我不想从参数更改列表,所以我认为这是唯一的方法。

标签: scalarecursionfunctional-programming

解决方案


这是一个非常简单的例子。它不是最佳的,您仍然可以改进它。

val list1 =  List(1,2,3,4,5,6,7,8,9)

def filter(list:List[Int], predicate:Int => Boolean):List[Int] = list match {
  case Nil => Nil
  case head :: rest => 
    val frest = filter(rest, predicate)
    if (predicate(head)) head :: frest else frest 
}

println(filter(list1, _ > 2)) //List(3, 4, 5, 6, 7, 8, 9)
println(filter(list1, _ %2 == 0)) //List(2, 4, 6, 8)

https://scalafiddle.io/sf/yvLEnYL/7

要理解它,您应该阅读 scala 中的递归和模式匹配。这里的技巧是这case head :: rest =>部分负责将列表吐出到第一个元素和其余部分(其余部分可以是空列表Nil)。有很多关于这方面的材料,例如 coursera 中有很棒的课程涵盖了这些主题(https://www.coursera.org/learn/progfun1)。


推荐阅读