반응형
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 |