如何在Scala中最好地表示一个 readline 循环?

20 浏览
0 Comments

如何在Scala中最好地表示一个 readline 循环?

从C/C++背景出发,我不太熟悉函数式编程风格,所以我的代码往往非常的命令式,因为在大多数情况下我看不到更好的方法来完成它。

我只是想知道有没有一种方法可以让这段Scala代码更具有“函数式”的特点呢?

var line:String = "";
var lines:String = "";
do {
    line = reader.readLine();
    lines += line;
} while (line != null)

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

0
0 Comments

这个怎么样?

val lines = Iterator.continually(reader.readLine()).takeWhile(_ != null).mkString

0