我有以下代码段,其中使用了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
方法的目的是什么?
非常感谢任何建议,
答案 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,因为它具有该格式(其中R
为Observable<String>
):
public interface Func0<R> extends Function, Callable<R> { @Override public R call(); }
在subscribe
的情况下,您提供了一种接受来自observable的值的方法。表示此问题的最佳界面是Action1(其中T1
是String
)
public interface Action1<T1> extends Action { public void call(T1 t1); }
当您撰写new Action1<>() {...}
或new Func0<>() {...}
时,您正在创建所谓的Anonymous Class。您正在定义调用方法Action1.call
或Func0.call
时会发生什么。
您的问题:
你怎么知道使用哪一个?我应该使用Action还是Func。
这取决于您的应用程序的需求。仔细阅读文档,了解哪种方法最适合您的需求。根据您选择的方法,您必须实现它在方法签名中指定的接口。
通话方法的目的是什么?
这是您正在使用的高阶函数所需的策略/接口中的方法名称。您将通过查看接口定义来了解名称。每个接口只是偶然声明一个名为call
的方法。其中一个可能很容易被标题为foo
而另一个bar
。