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

flatMap을 이용한 구구단 만들기

by JeongUPark 2019. 11. 13.
반응형

flatMap을 이용하여 구구단을 만들어 보겠습니다.

 

간단하게 다음과 같이 만들 수 있을 것입니다. (JAVA)

import io.reactivex.Observable;

import java.util.Scanner;

public class Multiplicationtable_test {
    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);
        System.out.println("Gugudan Input:");
        int num = Integer.parseInt(scanner.nextLine());

        Observable<Integer> observable = Observable.range(1,9);
        observable.subscribe(t-> System.out.println(t+" * "+num+" = "+t*num));


    }
}

Observable.range를 통하여 1부터 9까지의 값을 발행하는 함수입니다. 1부터 9까지 발행되면 그 값을 input과 *(곱셈 연산)을 하여 출력할 수 있습니다.

그리고 사용자 지정함수를 만들고 flatMap을 사용하여 다음과 같이도 만들 수 있습니다.(Kotlin)

import io.reactivex.Observable
import io.reactivex.functions.Function
import java.util.*

fun main(){
    val scanner = Scanner(System.`in`)
    println("Gugudn input:")
    val input = Integer.parseInt(scanner.nextLine())
    val gugudan =  Function<Int, Observable<String>>{num-> Observable.just(num).map {  it-> "$it * $input = ${it*input}"}}
    val observable = Observable.range(1,9).flatMap(gugudan)
    observable.subscribe(System.out::println)

}

마찬가지로 range를 사용하여 1부터 9까지 숫자를 발행하고 그 숫자 만큼 flatMap을 통하여 Observable을 발행합니다.

발행한 Observable에서 map을 통하여 곱센 연산을 수행합니다. 그리고 subscribe를 통하여 구독하여 결과를 확인 합니다.

그리고 flatMap의 원형을 보면

   @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper) {
        return flatMap(mapper, false);
    }

위 처럼 1가지 값을 받아서 결과를 반환하는 flatMap도 있지만

   @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <U, R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends U>> mapper,
            BiFunction<? super T, ? super U, ? extends R> resultSelector) {
        return flatMap(mapper, resultSelector, false, bufferSize(), bufferSize());
    }

이처럼 U,T를 받아서 R을 반환하는 BiFuntion을 사용하는 flatMap도 존재합니다. 이 flatMap을 사용하여 구구단을 만들면

JAVA

import io.reactivex.Observable;

import java.util.Scanner;

public class Multiplicationtable_test {
    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);
        System.out.println("Gugudan Input:");
        int input = Integer.parseInt(scanner.nextLine());
        Observable<String> observable = Observable.just(input).flatMap(gugu->Observable.range(1,9),(num,i)-> num+" * "+i+" = "+(num*i));
        observable.subscribe(System.out::println);
    }
}

Kotlin

import io.reactivex.Observable
import java.util.*

fun main(){
    val scanner = Scanner(System.`in`)
    println("Gugudn input:")
    val input = Integer.parseInt(scanner.nextLine())
    val observable = Observable.just(input)
        .flatMap({ gugu -> Observable.range(1, 9) }, { num, i -> num.toString() + " * " + i + " = " + num * i })
        observable.subscribe(System.out::println)
}

이렇게 작성할 수 있습니다.

반응형

'2023년 이전 > ReativeX' 카테고리의 다른 글

RxJava,RxKotlin - reduce  (0) 2019.11.13
RxJava, RxKotlin - filter  (0) 2019.11.13
RxJava,RxKotlin - flatMap()  (0) 2019.11.13
RxJava,RxKotlin - Map()  (0) 2019.11.13
RxJava,RxKotlin - Observable (5) - ConnectableObservable  (0) 2019.10.24