需要简单的 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);
}
我正在尝试在没有 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);
}