我正在尝试在没有 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/