需要简单的 map() reduce() 示例,其中 RXJava on Android 没有 Java 8 lambda

Need simple map() reduce() example with RXJava on Android without Java 8 lambdas

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

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

我已经实现了以下内容,但它似乎过于复杂。例如,我必须使 finalSum 成为一个数组,因为 .

我觉得它太复杂了,因为我可能误解了函数式编程/ReactiveX/函数式反应式编程等的一些基本知识

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 项目中,并提供将其转换为匿名内部 class.

的快速修复

I had to make finalSum be an array

toBlocking().firstOrDefault(null) 会得到 reduce 操作的结果,必要时阻塞它:

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?

您可以用 RxJava 数学库中的 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);
}