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

适合在rxjava中使用Func0和Action1有什么区别,java,rx-java,Java,Rx Java,我有以下代码段,其中使用了Func0和Action1 Observable.defer(new Func0<Observable<String>>() { @Override public Observable<String> call() { try { return Observable.just(Database.readValue()); } catc

我有以下代码段,其中使用了
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);     
        }   
    }
}
Observable.defer(新函数0(){
@凌驾
公共可观测呼叫(){
试一试{
返回Observable.just(Database.readValue());
}
捕获(IOE异常){
返回可观测误差(e);
}   
})
.订阅(新操作1(){
@凌驾
公共无效调用(字符串结果){
resultTextView.setText(结果);
}   
}
}
但我只是想知道它们之间有什么区别。我知道数字意味着参数的数量,即
Func0
没有参数,而
Action1
有1个参数

但是,您如何知道使用哪一个呢?我应该使用
Action
还是
Func

调用
方法的目的是什么


非常感谢您的建议,请查看它们的定义:

接口函数0{
R调用();
}
接口操作1{
无效通知(T);
}

Func0
提供数据,而
Action1
消耗数据。这是双重功能,你不能把两者弄错。

简短的回答;你会根据你调用的方法知道。

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

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

参数: observableFactory可观察工厂函数,为订阅结果可观察工厂的每个观察者调用

返回: 一种可观察对象,其观察者的订阅触发对给定可观察工厂函数的调用

public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory)...
subscribe
的情况下,您提供了一种从可观察对象接受值的方法。表示这一点的最佳界面是(其中
T1
字符串

公共接口操作1扩展了操作{
公开作废通知(T1);
}
当您编写
newaction1(){…}
newfunc0(){…}
时,您正在创建一个称为的。您正在定义调用方法
Action1.call
Func0.call
时发生的情况


你的问题:

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

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

调用方法的目的是什么

这是您正在使用的高阶函数所需的策略/接口中的方法名称。通过查看接口定义,您将知道该名称。每个接口都声明了一个名为
call
的方法。其中一个可以很容易地命名为
foo
,另一个可以命名为
bar

public final Subscription subscribe(final Action1<? super T> onNext)...
public interface Func0<R> extends Function, Callable<R> {
    @Override
    public R call();
}
public interface Action1<T1> extends Action {
    public void call(T1 t1);
}