4

我是 Scala 新手,但有一些 Java 背景。

在编写 Scala 代码时,以这种方式处理 Option 参数很有用:

val text = Option("Text")
val length = text.map(s => s.size)

s => s.size据我所知,每一个都带来了新的Function1[A, B]. 如果我进行例如 8 次这样的转换,它将带来 8 个额外的类。在绑定表单时,我非常频繁地使用这些片段,所以问题是:

我应该少用它,或者用 if 表示法代替它,还是这样的类泛滥对 JVM 不是很重要,或者 Scala 编译器有什么魔力?

更新:一个可能更具体的例子是:

case class Form(name: Option[String], surname: Option[String])
val bindedForm = Form(Option("John"), Option("Smith"))
val person = new Person
bindedForm.name.foreach(a => person.setName(a))
bindedForm.surname.foreach(a => person.setSurname(a))

它会产生两个不同的Function1[String, String]类吗?如果有数百个这样的转换怎么办?

4

1 回答 1

9

如果您正在为 Android 开发,那么您可能会使用 Dalvik 运行代码,它有一个烦人的 64k 方法限制(尽管有一些方法可以绕过它)。由于每个类都需要几个方法(构造函数和应用),这可能是个问题。

否则,Sun/Oracle JVM 上的类会进入 PermGen 空间,如果您确实需要,可以在启动 JVM 时对其进行调整。真的没关系。是的,你会有很多类,可能有数万个,但是 JVM 可以很好地处理它(至少如果你愿意提前告诉它会发生什么)。除非你知道你很可能会遇到一些不寻常的限制,否则这不是你应该担心的事情。

更多时候,人们可能会担心创建所有这些函数会降低性能——但如果你现在实际上没有遇到这种损失,也不要担心;这是 Scala 编译器原则上可以解决的问题,而且它一直在变得越来越聪明。所以只需以惯用的方式编写代码,除非它现在是一个大的性能问题,否则只希望编译器会来拯救你。有很大的机会,甚至更好的机会是,您会发现以“正确”的方式编写它并在需要时重构性能比采用使用更笨拙的构造的策略更容易,以防万一成为问题。当然,有些地方你可能提前知道肯定是瓶颈,

于 2012-12-17T18:22:16.623 回答