Подходит для использования Func0 и Action1 в rxjava, в чем разница

У меня есть следующий фрагмент кода, в котором используются 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?

Большое спасибо за любые предложения,

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
567
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Посмотрите на их определение:

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.

Другие вопросы по теме