试图附加到Iterable [String]

Zot*_*tov 3 iterable scala

我正在尝试将另一个字符串添加到Iterable [String]以便于连接,但结果并不是我所期望的.

scala> val s: Iterable[String] = "one string" :: "two string" :: Nil
s: Iterable[String] = List(one string, two string)

scala> s.mkString(";\n")
res3: String =
one string;
two string

scala> (s ++ "three").mkString(";\n")
res5: String =
one string;
two string;
t;
h;
r;
e;
e
Run Code Online (Sandbox Code Playgroud)

我应该如何重写此片段以在我的iterable中包含3个字符串?

编辑:我应该补充一下,应该保留项目的顺序

sen*_*nia 7

++用于集合聚合.没有方法+,:+或者addIterable,但你可以使用这样的方法++:

scala> (s ++ Seq("three")).mkString(";\n")
res3: String =
one string;
two string;
three
Run Code Online (Sandbox Code Playgroud)

  • FWIW我们*应该*只能做's +"三"`,但是由于`Predef.any2stringad`注入了无处不在的`+`运算符,我们最终会使用字符串连接而不是追加.你通常使用`:+`和`+:`来代替调用,但遗憾的是它们出现在`Seq`而不是`Iterable`上.这实际上是一致的,因为`+`也没有在`Iterable'上定义,但是有一个不幸的结果,试图在'Iterable'上使用`+`会导致一个预期的结果(而不是附加到可迭代或只是不编译,这两者都是可取的) (7认同)

mgu*_*min 5

++函数正在等待一个Traversable参数。如果您只使用"three",它会将字符串转换"three"为字符列表并将每个字符附加到s. 这就是为什么你会得到这个结果。

相反,您可以将“三个”包装在一个中Iterable,并且串联应该可以正常工作:

scala> (s ++ Iterable[String]("three")).mkString(";\n")
res6: String =
one string;
two string;
three
Run Code Online (Sandbox Code Playgroud)