android - 需要在 Android 上使用 RXJava 的简单 map()、reduce() 示例,无需 Java 8 lambda

标签 android rx-java java-7 reactivex

我正在尝试在没有 Java 8 的 Android 应用程序中应用 RXJava,这意味着我无法使用 lambda 函数。作为确保我理解基础知识的测试,我只想看一个使用map()和reduce()的简单示例。

我试图实现的示例是将作为字符串类型列表提供的整数相加。我想将整个事情包装在一个函数中,可以调用该函数来获取总和,而函数调用者不需要了解该函数是通过函数式编程实现的。

我已经实现了以下内容,但看起来过于复杂。例如,我必须将 FinalSum 设为数组,因为 error: cannot assign a value to final variable .

我觉得它过于复杂,因为我可能误解了函数式编程/ReactiveX/函数式响应式(Reactive)编程/等的一些基本知识。

public void mapReduceTest() {
    List<String> ints = new ArrayList<>();
    ints.add("10");
    ints.add("20");
    ints.add("30");

    System.out.println("finalSum[0] (should equal 60) = " + sumStringOfInts(ints));
}

public Integer sumStringOfInts(List<String> ints) {
    final Integer[] finalSum = new Integer[1];
    Observable.from(ints)
            .map(new Func1<String, Integer>() {

                @Override
                public Integer call(String s) {
                    return new Integer(s);
                }
            })
            .reduce(new Func2<Integer, Integer, Integer>() {
                @Override
                public Integer call(Integer x, Integer sum) {
                    return sum + x;
                }
            })
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer sum) {
                    finalSum[0] = sum;
                }
            });
    return finalSum[0];
}

有没有人有更简单的解决方案?

最佳答案

it seems overly complicated

Lambda 可以帮助您编写更简洁的代码。

I can't use lambda functions. As a test to make sure I understand the basics

在这种情况下你会得到很多样板文件。另外,许多 IDE 允许您编写 lambda,甚至在 Java 7 项目中也是如此,并提供将其转换为匿名内部类的快速修复。

I had to make finalSum be an array

toBlocking().firstOrDefault(null) 将为您提供归约操作的结果,并在必要时对其进行阻塞:

public Integer sumStringOfInts(List<String> ints) {
     return Observable.from(ints)
        .map(new Func1<String, Integer>() {
            @Override
            public Integer call(String s) {
                return Integer.parseInt(s);
            }
        })
        .reduce(new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer x, Integer sum) {
                return sum + x;
            }
        })
        .toBlocking()
        .firstOrDefault(null);
}

Does anyone have a simpler solution?

您可以用 RxJavaMath 库中的 MathObservable.sumInt() 替换 reduce 部分,但这并没有更漂亮:

public Integer sumStringOfInts(List<String> ints) {
     return 
        MathObservable.sumInteger(
           Observable.from(ints)
           .map(new Func1<String, Integer>() {
               @Override
               public Integer call(String s) {
                   return Integer.parseInt(s);
               }
           })
        )
        .toBlocking()
        .firstOrDefault(null);
}

关于android - 需要在 Android 上使用 RXJava 的简单 map()、reduce() 示例,无需 Java 8 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43686179/

相关文章:

android - 如何从具有多个条件的firebase数据库中选择数据

java - RxAndroid 简化一个常见的模式?

android - 使用 Retrofit 和 RX-java 处理无网络的正确方法

Java7/WatchEvent - 为什么它不是枚举?

java - 将照片保存到图库时出错 - Android Studio (java)

android - <layout_gravity ="start"> 在 NavigationView 上不起作用?

android - 如何忽略combineLatest 中的一个可观察值,但在组合器函数中可以使用其最新值?

java - Android 不支持 Java v7+,所以我应该使用多个 catch 还是一个带有 instanceof 检查的 catch?

java - Eclipse JDT 编译器 (ECJ) 在 Java 1.7 中抛出 NPE

android - Android 中带有 layout_weight 的线性布局中的无边框按钮