2016-11-10 8 views
6

Kann mir jemand erklären, wie kommt es, sowohl der Lambdas kann mit Methodenreferenzen hier ersetzt werden?Wie funktionieren Methodenreferenzen in RxJava?

In RxJava, map() nimmt einen Parameter vom Typ Func1<T, R>, dessen Kommentar heißt es, dass es "eine Funktion mit ein Argument". So verstehe ich völlig, warum valueOf(Object) hier funktioniert. Aber trim() dauert keine Argumente überhaupt.

Wie funktioniert das genau?

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

    .map(String::valueOf)   //method references 
    .map(String::trim)   // 
    .subscribe(); 
+2

Die Art, wie Methodenreferenzen arbeiten, ist, dass zum Beispiel Methoden wie 'trim',' Type :: instanceMethod' äquivalent zu '(Type t) -> t.instanceMethod()' sind. (Im Allgemeinen ist 'Type :: instanceMethod' '(Typ t, extraArgs) -> t.instanceMethod (extraArgs)'.) –

Antwort

4

ich in Java nicht mit RX spielen, aber bitte beachten Sie, dass String::valueOf eine statische ist (auch bekannt als ungebunden) Funktion, während String::trim eine nicht-statische (aka gebunden) Funktion ist, die indirekte this Argument haben. Also, beide Funktionen nehmen ein einzelnes Argument an. In Java ist es nicht so sichtbar wie in Python.

+4

Beachten Sie, dass Sie das Argument 'this' in Java tatsächlich explizit deklarieren können; es ist einfach nicht erforderlich. 'public void foo (Foo this) {}' ist äquivalent zu 'public void foo() {}'. – Pokechu22

+0

@ Pokechu22 Ich mag das. War mir nicht bewusst. Seit welcher Java-Version? Wissen Sie? –

+0

Ich bin mir ziemlich sicher, dass es in Java 8 hinzugefügt wurde. – Pokechu22