1

我的项目中有以下小而复杂的方法:

private def indent ( s : String )
  = s.lines.toStream match {
    case h +: t =>
      ( ("- " + h) +: t.map{"| " + _} ) mkString "\n"
    case _ => "- "
  }

将我的项目从 Scala 2.11 升级到 2.12 后,它将不再编译。错误:

CaseClassString.scala:14: value toStream is not a member of java.util.stream.Stream[String]

我尝试这样重写:

private def indent ( s : String )
  = Stream(s.lines) match {
    case h +: t =>
      ( ("- " + h) +: t.map{"| " + _} ) mkString "\n"
    case _ => "- "
  }

但它不起作用。

该方法在以下项目中找到: https ://github.com/nikita-volkov/sext

该函数将转换一个字符串,如:

metricResult: column: value: city
function: density
value: metricValue: 0.1

至:

- metricResult: column: value: city
| - function: density
| - value: metricValue: 0.1

有人对如何为 Scala 2.12 重写此方法有其他想法吗?

4

3 回答 3

2

我怀疑您也已将 JVM 从 Java 8 升级到 Java 11(或者正在使用编写的代码在 Java 11 上的 Java 8 上运行)。Java 11 添加了一个lines方法,String该方法会生成java.util.Stream[String]. 在 Java 8 上,没有lines方法Stringwhich 意味着 Scala 编译器可以隐式地将 a 转换Stringscala.collection.immutable.StringOps具有linesresult 类型的方法Iterator[String]

这里的诀窍是明确表示你想使用StringOps.lines而不是String.lines,所以像

val lines = (s: scala.collection.immutable.StringOps).lines
lines.toStream match {
  // etc.
}
于 2021-08-20T16:00:06.390 回答
1

看来您不仅升级了 Scala,还升级了 Java 版本。String如果您仅查看与Java 和 Scala相关的更改,则该错误很容易理解。

import scala.collection.immutable.StringOps

def indent(s : String): String =
  (s: StringOps).lines.toStream match {
    case h +: t =>
      ( ("- " + h) +: t.map{"| " + _} ) mkString "\n"
    case _ => "- "
  }

或者,如果您正在使用 Java 11 并且实际上并不需要 Stream,那么,

def indent(s : String): String =
  s.lines.toArray.toList match {
  case h :: t =>
    val indented = ("- " + h) :: t.map{"| " + _}
    indented.mkString("\n")
  case _ => "- "
}
于 2021-08-20T16:08:01.430 回答
0

与安德烈的解决方案非常相似,但有效:

def indent(s: String) = s.linesIterator.mkString("- ", "\n| - ", "")

代码在sctie运行。

于 2021-08-21T20:08:31.433 回答