适合在rxjava中使用Func0和Action1有什么区别

时间:2018-03-21 01:12:41

标签: java rx-java

我有以下代码段,其中使用了Func0Action1

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方法的目的是什么?

非常感谢任何建议,

2 个答案:

答案 0 :(得分:5)

看看他们的定义:

interface Func0<R> {
    R call();
}

interface Action1<T> {
    void call(T t);
}

Func0提供数据,而Action1使用数据。这些是双重功能,你不能误解这两个。

答案 1 :(得分:4)

答案简短;你会根据你打电话的方式知道。

首先让我们看一下您尝试使用的两种方法:

  

Observable.defer   返回一个Observable,它调用Observable工厂为每个订阅的新Observer创建一个Observable。也就是说,对于每个订户,订户观察的实际Observable由工厂函数确定。

     

<强>参数:   observableFactory Observable工厂函数,用于为订阅生成的Observable的每个Observer调用

     

<强>返回:   一个Observable,其Observers的订阅触发了对给定的Observable工厂函数的调用

public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory)...
  

Observable.subscribe   订阅Observable并提供回调来处理它发出的项目。

     

<强>参数:   onNext你设计的Action1接受来自Observable的排放

     

<强>返回:   观察者可以在Observable完成发送之前停止接收项目的订阅引用

public final Subscription subscribe(final Action1<? super T> onNext)...

您在上面看到的是Higher-order functions的两个示例或Strategy Pattern的实现,每个都接受不同的策略格式。

defer的情况下,您提供了一种创建新Observable但未提供初始输入的方法。请求Func0,因为它具有该格式(其中RObservable<String>):

public interface Func0<R> extends Function, Callable<R> {
    @Override
    public R call();
}

subscribe的情况下,您提供了一种接受来自observable的值的方法。表示此问题的最佳界面是Action1(其中T1String

public interface Action1<T1> extends Action {
    public void call(T1 t1);
}

当您撰写new Action1<>() {...}new Func0<>() {...}时,您正在创建所谓的Anonymous Class。您正在定义调用方法Action1.callFunc0.call时会发生什么。

您的问题:

  

你怎么知道使用哪一个?我应该使用Action还是Func。

这取决于您的应用程序的需求。仔细阅读文档,了解哪种方法最适合您的需求。根据您选择的方法,您必须实现它在方法签名中指定的接口。

  

通话方法的目的是什么?

这是您正在使用的高阶函数所需的策略/接口中的方法名称。您将通过查看接口定义来了解名称。每个接口只是偶然声明一个名为call的方法。其中一个可能很容易被标题为foo而另一个bar