RxJava中的方法引用如何工作?

Grz*_* D. 6 java lambda rx-java retrolambda

有人可以解释一下,为什么这两个 lambda都可以用这里的方法引用替换?

在RxJava中,map()接受一个类型的参数Func1<T, R>,其注释声明它"表示具有一个参数的函数".因此我完全理解为什么valueOf(Object)在这里工作.但trim()需要任何参数都没有.

那么这是如何工作的呢?

Observable.just("")
    .map(s -> String.valueOf(s))  //lambdas
    .map(s -> s.trim())           //

    .map(String::valueOf)         //method references
    .map(String::trim)            //
    .subscribe();
Run Code Online (Sandbox Code Playgroud)

Mic*_*jer 3

我没有在 java 中使用 RX,但请注意,这String::valueOf是一个静态(又名未绑定)函数,而String::trim是一个具有间接参数的非静态(又名绑定)函数this。因此,事实上,这两个函数都采用单个参数。例如,在 Java 中,它不像在 Python 中那样可见。

  • 请注意,您实际上可以在 Java 中显式声明“this”参数;这只是不需要的。`public void foo(Foo this) {}` 等价于 `public void foo(){}`。 (4认同)
  • `Foo this` 称为“接收器参数”,在 [JLS, §8.4.1](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html #jls-8.4.1)。您可以对内部类构造函数执行相同的操作,例如外部类“Foo”和内部类“Bar”,其构造函数可以写为“Bar(Foo Foo.this)”。 (2认同)