如何在Scala中最好地表示一个 readline 循环?
如何在Scala中最好地表示一个 readline 循环?
从C/C++背景出发,我不太熟悉函数式编程风格,所以我的代码往往非常的命令式,因为在大多数情况下我看不到更好的方法来完成它。
我只是想知道有没有一种方法可以让这段Scala代码更具有“函数式”的特点呢?
var line:String = ""; var lines:String = ""; do { line = reader.readLine(); lines += line; } while (line != null)
admin 更改状态以发布 2023年5月21日
Scala中你实际上可以这样写:
val lines = scala.io.Source.fromFile("file.txt").mkString
但这只是一个语法糖。参见在Scala中读取整个文件? 查看其他可能性。你实际上问的是如何将函数式编程应用到这个问题中。这里是一个提示:
Source.fromFile("file.txt").getLines().foreach {println}
你有了这个想法吗? 在文件的每一行上使用foreach
执行println
函数。另外不用担心,getLines()
返回一个迭代器,而不是整个文件。现在问题变得严重了:
lines filter {_.startsWith("ab")} map {_.toUpperCase} foreach {println}
明白了吗?接受lines
(它可以是数组,列表,集合,迭代器,任何可以被筛选且包含具有startsWith
方法的项的内容)和filter
,仅获取以"ab"
开头的项。现在将每个项应用toUpperCase
方法进行map
。最后将每个结果项print
出来。
最后一个想法:您不仅仅限于单一数据类型。例如,假设您有一个文件,其中包含整数,每行一个。如果您想要读取该文件,解析数字并将它们求和,只需执行:
lines.map(_.toInt).sum