2016-11-10 2 views
6

Может кто-нибудь объяснить мне, как получилось как из lambdas можно заменить здесь ссылкой на метод?Как работают ссылки на методы в RxJava?

В 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(); 
+2

Работа метода метода метода заключается в том, что, например, методы типа 'trim',' Type :: instanceMethod' эквивалентны '(Type t) -> t.instanceMethod()'. (В более общем смысле, 'Type :: instanceMethod' is' (Type t, extraArgs) -> t.instanceMethod (extraArgs) '.) –

ответ

4

Я не играл с RX в Java, но обратите внимание, что String::valueOf является статическим (акой несвязанной) функции, в то время как String::trim не является статичным (иначе связанно) функцией, которые имеют косвенный this аргумент. Таким образом, на самом деле обе функции принимают один аргумент. В Java это не так заметно, как в Python.

+4

Обратите внимание, что вы действительно можете явно объявить аргумент' this' в Java; это просто не требуется. 'public void foo (Foo this) {}' эквивалентно 'public void foo() {}'. – Pokechu22

+0

@ Pokechu22 Мне это нравится. Не знал. С какой версии Java? Вы знаете? –

+0

Я уверен, что он был добавлен в Java 8. – Pokechu22

Смежные вопросы