The String.format http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.htmlJava 中的方法期望Objects
作为其论点。这Object
Java 中的类型相当于AnyRef
在 Scala 中输入。 Scala 中的基本类型扩展AnyVal
– not AnyRef
。详细了解两者之间的差异AnyVal
, AnyRef
, and Any
在文档中 http://www.scala-lang.org/old/node/128 or in 这个答案 https://stackoverflow.com/questions/2335319/what-are-the-relationships-between-any-anyval-anyref-object-and-how-do-they-m。最明显的修复方法是使用Integer
来自 Java 的包装类以获得Object
代表你的Ints
:
String.format("\\u%04x\\u%04x", new Integer(hi), new Integer(lo))
使用这些包装类几乎是不惯用的 Scala 代码的象征,并且仅在没有更好的选择时才应用于与 Java 的互操作性。在 Scala 中执行此操作更自然的方法是使用StringOps http://www.scala-lang.org/api/2.11.5/index.html#scala.collection.immutable.StringOps等效方法format
:
"\\u%04x\\u%04x".format(hi, lo)
您还可以使用f插值器 http://docs.scala-lang.org/overviews/core/string-interpolation.html#the-f-interpolator更简洁的语法:
f"\\u$hi%04x\\u$lo%04x"
另外,使用for
像这里这样的循环在 Scala 中是不惯用的。您最好使用功能列表方法之一,例如map
, foldLeft
, 甚至foreach
与使用的部分函数一起match
句法。例如,您可以尝试以下操作:
toCodePointArray(input).foreach {
case x if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
sb.append(f"\\u$hi%04x\\u$lo%04x")
case x if > 127 => sb.append(f"\\u$x%04x")
case x => sb.append(f"$x%c")
}
或者,如果您不必使用StringBuilder
,实际上只需要在附加许多字符串的情况下使用,您可以将整个方法体替换为foldLeft
:
def escapeUnicodeStuff(input: String) = toCodePointArray(input).foldLeft("") {
case (acc, x) if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
acc + f"\\u$hi%04x\\u$lo%04x"
case (acc, x) if x > 127 => acc + f"\\u$x%04x"
case (acc, x) => acc + f"$x%c"
}
或者甚至map
随后是一个mkString
:
def escapeUnicodeStuff(input: String) = toCodePointArray(input).map {
case x if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
f"\\u$hi%04x\\u$lo%04x"
case x if x > 127 => f"\\u$x%04x"
case x => f"$x%c"
}.mkString