Я пытаюсь применить RXJava в приложении для Android без Java 8, то есть я не могу использовать лямбда-функции. В качестве теста, чтобы убедиться, что я понимаю основы, я просто хотел бы увидеть простой пример с использованием map() и reduce().
Пример, который я пытаюсь реализовать, заключается в суммировании целых чисел, представленных в виде списка типа String. Я хотел бы обернуть все это в функцию, которую можно вызвать для получения суммы без того, чтобы вызывающая функция понимала, что функция реализована с помощью функционального программирования.
Я реализовал следующее, но это кажется слишком сложным. Например, мне пришлось сделать 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];
}
У кого-нибудь есть более простое решение?
sumStringOfInts()
и подписался на него, когда мне нужно выполнить операцию. Вам не нужно было бы делать этот трюк с Integer[] (который не сработал бы, если бы вы подписались на другой поток). - person mVck   schedule 28.04.2017