// Function 인터페이스를 통해 제네릭 타입을 선언. val getDoubleDiamonds : (String) -> Observable<String> = { ball: String -> Observable.just<String>("$ball<>", "$ball<>") }
// 3개의 데이터를 넣었는데 6개를 발행한다. // 일대다이고, Observable 을 반환한다. // 위에서 정의한 Function 인터페이스 사용. Observable.just("1", "2", "3") .flatMap(getDoubleDiamonds) .subscribe({ println("성공 : $it") }, { println("실패 : ${it.message}") })
// 6. skipLast -> 100,200,300 source.skipLast(3) .subscribe({ println("skipLast result : $it") }, { println("error : ${it.message}") }) } // 결과 first result : 100 last result : 600 take result : 100 take result : 200 take result : 300 takeLast result : 400 takeLast result : 500 takeLast result : 600 skip result : 300 skip result : 400 skip result : 500 skip result : 600 skipLast result : 100 skipLast result : 200 skipLast result : 300
4.reduce()
발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때 활용한다.
함수형 프로그래밍의 가장 기본 연산자인 map/filter/reduce 패턴을 이루는 마지막 필수 함수이다.
Observable을 이용해 들어오는 데이터를 1개씩 모아서 최종 결과를 만들어야 할 때 사용한다고 생각하면 된다. 주로 수치와 관련된 계산 문제에서 활용하면 좋다.
보통 Observable에 입력된 데이터를 필요한 map() 함수로 매핑하고, 원하는 데이터만 추출할 때는 불필요한 데이터를 걸러내는 filter() 함수를 사용한다. 또한 상황에 따라 발행된 데이터를 취합하여 어떤 결과를 만들어낼 때는 reduce 계열의 함수를 사용한다.
// 1. 데이터 입력. // first : 상품 이름, second : 매출액. var sales = mutableListOf<Pair<String, Int>>() sales.add("TV" to 2500) sales.add("Camera" to 300) sales.add("TV" to 1600) sales.add("Phone" to 800) sales.add("Sofa" to 10000) sales.add(Pair("TV", 1000))
val source: Maybe<Int> = Observable.fromIterable(sales) // 2. 매출 데이터 중 TV 매출을 필터링한다. .filter { sale -> sale.first == "TV" } // map 을 통해 sale 에서 매출액만 뽑는다. .map { sale -> sale.second } // 3. reduce 를 통해 매출의 합을 구한다. .reduce { sale1, sale2 -> sale1 + sale2 } // reduce 를 호출하기 때문에 Observable 이 아니라 Maybe 를 사용한다.
source.subscribe({ total -> println("TV Sale: $ $total") }, { println("error : ${it.message}") }) } // 결과 TV Sale: $ 4100