java – Scala:String“”vs“”

前端之家收集整理的这篇文章主要介绍了java – Scala:String“”vs“”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 Scala的新人,我已经看到了在Scala中连接Strings的代码,如下所示:
"test " ++ "1"

而且我已经测试了,也写在Scala Doc

"test " + "1"

所以我的理解就是像Java字符串那样更强大,可以接受更多的参数类型.也似乎是普遍的其他事情像列表.我想知道我的理解是否正确.和其他任何差异?什么时候应该一个又一个只是为了字符串连接?

解决方法

它有助于在 scala.Predef看看究竟发生了什么.

如果你检查那里,你会发现Scala中的String只是java.lang.String的一个别名.换句话说,String上的方法被转换为Java的运算符.

所以,如果一个Scala字符串只是一个Java字符串,该方法如何存在,你可能会问. (嗯,我至少会问,)答案是,由RectString方法提供的String到WrappedString的一个隐式转换,也是在Predef中.

请注意,需要任何GenTraversableOnce实例,并将该实例中的所有元素添加到原始的WrappedString中. (请注意,文档不正确地声明该方法返回一个WrappedString [B],这必须是不正确的,因为WrappedString不会使用类型参数.)你会得到的是一个String(如果你添加的东西是一个Seq [Char])或一些IndexedSeq [Any](如果不是).

这里有些例子:

如果你添加一个字符串到列表[Char],你会得到一个字符串.

scala> "a" ++ List('b','c','d')
res0: String = abcd

如果你添加一个String到List [String],你得到一个IndexedSeq [Any].事实上,前两个元素是Chars,但最后三个是Strings,如后续调用所示.

scala> "ab" ++ List("c","d","e")
res0: scala.collection.immutable.IndexedSeq[Any] = Vector(a,b,c,d,e)

scala> res0 map ((x: Any) => x.getClass.getSimpleName)
res1: scala.collection.immutable.IndexedSeq[String] = Vector(Character,Character,String,String)

最后,如果你添加一个String到一个String,你会得到一个String.这样做的原因是WrappedString继承自IndexedSeq [Char],所以这是一个复杂的方法,将Seq [Char]添加到Seq [Char]中,这样可以让您返回Seq [Char].

scala> "abc" + "def"
res0: String = abcdef

正如Alexey所说,这些都不是一个非常微妙的工具,所以你可能更喜欢使用string interpolationStringBuilder,除非有很好的理由不要.

猜你在找的Java相关文章