본문 바로가기
2023년 이전/ReativeX

RxJava,RxKotlin - reduce

by JeongUPark 2019. 11. 13.
반응형

[출처 - 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