scala中toString和mkString有什么区别?

ala*_*lan 24 java string scala tostring

我有一个包含10行的文件 - 我想检索它,然后用换行符("\n")分隔符拆分它们.

这就是我做的

val data = io.Source.fromFile("file.txt").toString;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在换行符上拆分文件时,这会导致错误.

然后我试过了

val data = io.Source.fromFile("file.txt").mkString;
Run Code Online (Sandbox Code Playgroud)

它奏效了.

有没有搞错?有人能告诉我这两种方法有什么区别吗?

S.R*_*R.I 34

我们来看看类型吧?

scala> import scala.io._
import scala.io._

scala> val foo = Source.fromFile("foo.txt")
foo: scala.io.BufferedSource = non-empty iterator

scala> 
Run Code Online (Sandbox Code Playgroud)

现在,您已读取文件的变量foo.txt是迭代器.如果toString()对它执行调用,它不会返回文件的内容,而是返回您创建的迭代器的String表示形式.OTOH,mkString()读取迭代器(即迭代它)并根据从中读取的值构造一个长字符串.

有关更多信息,请查看此控制台会话:

scala> foo.toString
res4: java.lang.String = non-empty iterator

scala> res4.foreach(print)
non-empty iterator
scala> foo.mkString
res6: String = 
"foo
bar
baz
quux
dooo
"

scala> 
Run Code Online (Sandbox Code Playgroud)

  • Simon Peyton-Jones风格介绍+1 (4认同)

nom*_*mad 26

toString方法应该返回对象的字符串表示.它经常被覆盖以提供有意义的表示.mkString方法是在集合上定义的,是一种将集合的元素与提供的字符串连接起来的方法.例如,尝试以下方法:

val a = List("a", "b", "c")
println(a.mkString(" : "))
Run Code Online (Sandbox Code Playgroud)

你会得到"a:b:c"作为输出.mkString方法通过使用您提供的字符串连接集合的元素,从集合中创建了一个字符串.在您发布的特定情况下,mkString调用将BufferedSource迭代器返回的元素与空字符串连接起来(这是因为您调用了没有参数的mkString).这导致简单地将集合中的所有字符串(由BufferedSource迭代器产生)连接在一起.

另一方面,在这里调用toString并没有多大意义,因为你得到的(当你没有得到错误时)是BufferedSource迭代器的字符串表示形式; 它只是告诉你迭代器是非空的.