scala - 如何从 scala 中的函数返回新列表?
问题描述
出于教育目的,我想实现一个过滤器函数,它接受一个像 (_ > 4) 这样的过滤器和一个列表作为参数。它应该返回过滤后的列表。基本上它应该和已经可用的 list.filter 函数一样,但我想自己实现它。问题是如何从函数中创建一个新列表。我不想从参数更改列表,所以我认为这是唯一的方法。
解决方案
这是一个非常简单的例子。它不是最佳的,您仍然可以改进它。
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)。
推荐阅读
- javascript - 浏览器通过启动电子应用程序或类似应用程序来获取机器 ID
- android - Telegram for Android 似乎不支持文件处理应用程序的 `launchMode=singleTask`
- angular - 使用 travis 部署时渲染角度页面失败
- android - 为什么房间数据库数据加载很长很慢
- windows - 限制在一次计划任务中发送电子邮件 Laravel
- xcode - 如何在没有付费开发者帐户的情况下通过 url 分发 .ipa
- css - 没有衬线字体的Fontawesome
- amazon-redshift - 无法从 AWS Redshift 访问 AWS Athena 表
- cordova - 当应用程序关闭时,我可以从服务器调用我的通知功能吗?
- python - 如何在Django的另一个python脚本中使用上传的文件名