我在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
方法的目的是什么?
非常感谢您的任何建议,
简短的答案;您将基于所调用的方法知道。
首先,让我们看一下您要使用的两种方法:
Observable.defer返回一个Observable,该Observable调用Observable工厂为每个订阅的新Observer创建一个Observable。即,对于每个订户,订户观察的实际可观测值由工厂功能确定。
参数:observableFactory Observable工厂函数,可为预订结果Observable的每个Observer调用
返回:一个Observable,其Observers的预订触发对给定Observable工厂函数的调用
public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory)...
Observable.subscribe订阅Observable,并提供回调以处理其发出的项目。
参数:onNext您设计为接受来自Observable的发射的Action1
返回:订阅参考,观察者可以使用它来在Observable完成发送项目之前停止接收它们
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
您提供一种从可观察对象接受值的方法。代表这一点的最佳接口是Action1(其中T1
是String
)
public interface Action1<T1> extends Action { public void call(T1 t1); }
在编写new Action1<>() {...}
或new Func0<>() {...}
创建匿名类时。您在适当的位置定义了调用方法Action1.call
或方法时会发生什么Func0.call
。
你的问题:
您怎么知道要使用哪个?我应该使用Action还是Func。
这取决于您的应用程序的需求。通读文档,看看哪种方法最适合您的需求。根据您选择的方法,您必须实现它在方法签名中指定的接口。
调用方法的目的是什么?
这是所使用的高阶函数所需的策略/界面中方法的名称。通过查看接口定义,您将知道名称。每个接口声明一个名为的方法只是偶然call
。一个很容易被冠名foo
,另一个很容易被冠名bar
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句