У меня есть следующий фрагмент кода, в котором используются Func0 и Action1.
Observable.defer(new Func0<Observable<String>>() {
@Override
public Observable<String> call() {
try {
return Observable.just(Database.readValue());
}
catch(IOException e) {
return Observable.error(e);
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String result) {
resultTextView.setText(result);
}
}
}
Но мне просто интересно, в чем разница между ними. Я понимаю, что число означает количество параметров, т.е. Func0 не имеет параметров, а Action1 имеет 1 параметр.
Однако как узнать, какой из них использовать? Что мне использовать: Action или Func.
Какова цель метода call?
Большое спасибо за любые предложения,




Посмотрите на их определение:
interface Func0<R> {
R call();
}
interface Action1<T> {
void call(T t);
}
Func0 предоставляет данные, тогда как Action1 потребляет данные. Это двойные функции, и вы не можете перепутать их.
Краткий ответ; Вы узнаете, исходя из того, какой метод вы вызываете.
Сначала давайте взглянем на два метода, которые вы пытаетесь использовать:
Observable.defer Returns an Observable that calls an Observable factory to create an Observable for each new Observer that subscribes. That is, for each subscriber, the actual Observable that subscriber observes is determined by the factory function.
Parameters: observableFactory the Observable factory function to invoke for each Observer that subscribes to the resulting Observable
Returns: an Observable whose Observers' subscriptions trigger an invocation of the given Observable factory function
public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory)...
Observable.subscribe Subscribes to an Observable and provides a callback to handle the items it emits.
Parameters: onNext the Action1 you have designed to accept emissions from the Observable
Returns: a Subscription reference with which the Observer can stop receiving items before the Observable has finished sending them
public final Subscription subscribe(final Action1<? super T> onNext)...
Выше вы видите два примера Функции высшего порядка или реализации Шаблон стратегии, каждая из которых принимает свой формат стратегии.
В случае defer вы предоставляете способ создать новый Observable без первоначального ввода. Запрашивается Func0, потому что он имеет этот формат (где R - это Observable<String>):
public interface Func0<R> extends Function, Callable<R> { @Override public R call(); }
В случае subscribe вы предоставляете способ принять значение из наблюдаемого. Лучшим интерфейсом для представления этого будет Действие1 (где T1 - это String)
public interface Action1<T1> extends Action { public void call(T1 t1); }
Когда вы пишете new Action1<>() {...} или new Func0<>() {...}, вы создаете то, что известно как Анонимный класс. Вы определяете на месте, что происходит при вызове метода Action1.call или Func0.call.
Ваши вопросы:
how would you know which one to use? Should I use Action or Func.
Это зависит от потребностей вашего приложения. Прочтите документацию и посмотрите, какой метод лучше всего соответствует вашим потребностям. В зависимости от выбранного вами метода вам придется реализовать интерфейс, указанный в сигнатуре метода.
What is the purpose of the call method?
Это имя метода в стратегии / интерфейсе, которое требуется для функции более высокого порядка, которую вы используете. Вы узнаете имя, посмотрев на определение интерфейса. Только случайно каждый интерфейс объявляет метод с именем call. Один можно было бы легко назвать foo, а другой - bar.