RxJava运营商

时间:2014-12-17 14:27:49

标签: java android rx-java

我正在使用这篇文章学习rxjava:http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/ 并且无法重现本文的第一个示例 我接下来做了:

Observable<List<String>> query(String text); //Gradle: error: missing method body, or declare abstract

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    query.subscribe(urls -> {    //Gradle: error: cannot find symbol variable query
        for (String url : urls) {
            System.out.println(url);
        }
    });

}

但我有错误,我在评论中添加了这些错误 我做错了什么?

2 个答案:

答案 0 :(得分:6)

除了Java 8 lambdas之外,这里的大多数人都错过了这样一个事实,即你的代码无法编译,无论是RetroLambda还是你找到的任何其他漂亮的工具来解决Android中错过的lambda特性 ...

所以,仔细看看你的代码,你甚至在代码片段中添加了一些注释,这些注释实际上解释了为什么你有一些编译错误:

1您的方法是空身

Observable<List<String>> query(String text);

因此,为它添加一个方法体并解决问题。你想让我做什么?你还不知道吗?然后添加一个虚拟或空体并稍后解决:

Observable<List<String>> query(String text) {
  return Observable.just(Arrays.asList("url1", "url2"));
}

2您的代码中根本没有query变量。您所拥有的是query方法,使用方法的语法要求您使用大括号:

query("whatever").subscribe(urls -> {
        for (String url : urls) {
            System.out.println(url);
        }
    });

现在添加RetroLambda或使用匿名类,您就完成了。请记住,没有任何内容可以为您的代码添加更多功能,但只会解决那些编译错误。现在问问自己,您希望在查询方法中做些什么并继续。

注意:Observable对象是一个数据流,这基本上意味着您可能获得零元素,一个元素或多个元素;所有这些指定类型的实例。因此,您的代码似乎需要一串字符串列表,如果您真正想要的是字符串流,那么将Observable<List<String>>替换为Observable<String>

答案 1 :(得分:3)

Gradle: error:你的意思是编译错误?您应该在query.subscribe(urls -> {之间放置括号,因为这不是变量或类别,而是方法,所以您应该调用它来让Observable订阅。

那么,您还需要实现查询方法以返回Observable,例如:

private Observable<String> query() {

    return Observable.just("one", "two", "three");

}

由于Java 8,您将收到另一个构建错误,但正如评论中已经提到的,您可以轻松地使用retrolamda和gradle来解决问题。否则,您可以使用Android Studio快速修复程序将java 8 lambdas转换为java 6匿名类。