Yar*_*lav 3 lambda scala apply
我有以下代码
scala> val builder = new StringBuilder("foo bar baz ")
builder: StringBuilder = foo bar baz
scala> (0 until 5) foreach { builder.append("!") }
scala> builder.toString
res15: String = foo bar baz !
Run Code Online (Sandbox Code Playgroud)
我想这实际上就像是
(0 until 5) foreach builder.append("!").apply
Run Code Online (Sandbox Code Playgroud)
发生.任何人都可以向我解释为什么会发生这种情况或者我错了究竟发生了什么?
要了解发生了什么,我使用了我的小工具scala-to-java.
您的代码转换为Java,如下所示:
public final class _$$anon$1 {
private final StringBuilder builder = new StringBuilder("foo bar baz ");
private StringBuilder builder() {
return this.builder;
}
{
RichInt$.MODULE$.until$extension0(Predef$.MODULE$.intWrapper(0), 5).foreach((Function1<Object, Object>)this.builder().append("!"));
this.builder().toString();
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,结果builder.append("!")也StringBuilder只是被转换Function1为foreach中的函数参数.
显然,StringBuilder如果你检查它的类型层次结构,确实是一个函数:
作为结论:
StringBuilder从一个功能或部分功能Int,以Charappend仅评估一次,它的result(StringBuilder)用作函数.