[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]
본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다
마블다이어그램 참고 - http://reactivex.io/RxJava/javadoc/io/reactivex/Flowable.html#reduce-io.reactivex.functions.BiFunction-
reduce함수는 발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때 활용합니다.
위의 마블다이어그램을 보면 원3개가 reduce를 통하여 최종적으로 합체지는것을 볼 수 있습니다.
reduce는 설명이나 마블다이어그램을 보고 바로 감이 오진 안습니다. code를 통하여 확인해보도록 하겠습니다.
Java
import io.reactivex.Maybe;
import io.reactivex.Observable;
public class reduce_test {
public static void main(String[] args){
String[] balls = {"1","2","3"};
Maybe<String> observable = Observable.fromArray(balls).reduce((ball1, ball2)-> ball2+"("+ball1+")");
observable.subscribe(System.out::println);
}
}
Kotlin
import io.reactivex.Observable
fun main(){
val balls = arrayOf("1", "2", "3")
val observable = Observable.fromArray(*balls).reduce { ball1, ball2 -> "$ball2($ball1)" }
observable.subscribe(System.out::println)
}
결과 값은 3(2(1)) 이라는 결과 값이 나옵니다.
code에서 reduce의 반환 값은 Maybe라는 것을 알 수 있습니다.(Maybe는 최종 데이터가 1개인 Single과 비슷한 클래스 입니다. 자세한 사항은 여기 참조)
reduce 함수의 원형을 보면
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final Maybe<T> reduce(BiFunction<T, T, T> reducer) {
ObjectHelper.requireNonNull(reducer, "reducer is null");
return RxJavaPlugins.onAssembly(new ObservableReduceMaybe<T>(this, reducer));
}
이렇게 BiFunction 인터페으스를 활용하는 것을 알 수 있습니다. 그리고 인자를 2개 받는다는 것도 알 수 있습니다.
Java의 람다 표현식을 분리하면
import io.reactivex.Maybe;
import io.reactivex.Observable;
import io.reactivex.functions.BiFunction;
public class reduce_test {
public static void main(String[] args){
String[] balls = {"1","2","3"};
BiFunction<String,String,String> reducefun =new BiFunction<String, String, String>() {
@Override
public String apply(String s, String s2) {
System.out.println("s: "+s);
System.out.println("s2: "+s2);
return s2+"("+s+")";
}
};
Maybe<String> observable = Observable.fromArray(balls).reduce(reducefun);
observable.subscribe(System.out::println);
}
}
그 결과를 보면
s: 1
s2: 2
s: 2(1)
s2: 3
3(2(1))
이런 것을 알 수 있습니다.
마지막으로 map filter 그리고 reduce를 사용하여 list에서 일정 항목에 대한 결과 값을 출력하는 coding을 해보겠습니다.
kotlin
import io.reactivex.Maybe
import io.reactivex.Observable
fun main(){
var datalist = mutableListOf<Pair<String,Int>>()
datalist.add(Pair("TV", 20000))
datalist.add(Pair("Radio", 2000))
datalist.add(Pair("Phone", 30000))
datalist.add(Pair("TV", 150000))
datalist.add(Pair("TV", 250000))
var source = Observable.fromIterable(datalist).filter{it->it.first.contains("TV")}.map { it->it.second }.reduce{it1,it2->it1+it2}
source.subscribe{it->println("sum: $it")}
}
datalist에 들어간 Pair 값들 중 first 가 TV인 항목의 second 값을 합한 결과를 보여주는 code 입니다.
code를 설명하면 fromIterable을 통하여 datalist의 각 값들을 발행하고 그 각각의 값들 중 filter를 통하여 first값이 TV를 포함하는 값을 걸러냅니다. 그리고 그 값들 중 map을 통하여 다시 second에 있는 숫자를 발행합니다. 그리고 최종적으로 reduce를 통하여 발행된 값들을 다 더합니다. 그리고 그 결과 값은 sum: 420000 가 됩니다.
'2023년 이전 > ReativeX' 카테고리의 다른 글
RxJava, RxKotlin - timer (0) | 2019.11.20 |
---|---|
RxJava,RxKotlin - Interval (0) | 2019.11.20 |
RxJava, RxKotlin - filter (0) | 2019.11.13 |
flatMap을 이용한 구구단 만들기 (0) | 2019.11.13 |
RxJava,RxKotlin - flatMap() (0) | 2019.11.13 |