기록 - 리액티브 연산자(1)

16731 단어 RxJavaRxJava

1. map() 함수

  • 입력값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수
  • 입력 데이터와 그것을 변환해줄 함수를 이어주는 중개업자의 역할

String[] balls = {"1","2","3","5"};
Observable<String> source = Observable.fromArray(balls)
	.map(ball -> ball + "💠");
source.subscribe(Log::i);

RxJava의 제네릭 함수형 인터페이스

인터페이스 이름포함 메소드설명
Predicateboolean test(T t)t 값을 받아서 참이나 거짓을 반환합니다
Consumervoid accept(T t)t 값을 받아서 처리합니다. 반환값은 없습니다.
Function<T,R>R apply(T t)t 값을 받아서 결과를 반환

💁Function 인터페이스를 적용한 map() 함수

Function<String, String> getDiamond = ball -> ball + "<>"

String[] balls = {"1","2","3","5"};
Observable<String> source = Observable.fromArray(balls)
	.map(getDiamond);
source.subscribe(Log::i);

🎈 map 함수는 입력 타입과 반환 타입이 같을 필요가 없다. ( 컴파일러가 알아서 타입 추론)

2. flatMap() 함수

  • map() 함수와 비슷하지만, 결과가 Observable로 나온다.
  • map() 함수가 일대일 함수라면, flatMap()은 일대다 혹은 일대일 Observable 함수

💁빨간 원을 넣으면 빨간색 다이아몬드 2개가 나오고, 초록색 원을 넣으면 같은 방식으로 초록색 다이아몬드 2개가 나온다. ⇒ **Observable이므로 여러 개의 데이터를 발행할 수 있다.**
<Observable<String> source = Observable.fromArray(balls)
	.flatMap(ball -> Observable.just(ball + "<>", ball + "<>"));

ex) 구구단 프로그램

Java

Scanner in = new Scanner(System in);
System.out.println("Gugudan Input:");
int dan = Integer.parseInt(in.nextLine());
for(int row = 1; row <= 9; ++row) 
	System.out.println(dan + "*" + row + "=" + dan * raw);

flapMap() 함수를 이용하여 바꿔보기

  1. for문 ⇒ Observable로 변환
Scanner in = new Scanner(System in);
System.out.println("Gugudan Input:");
int dan = Integer.parseInt(in.nextLine());

Observable<Integer> source = Observable.range(1,9)'
source.subscribe(row -> System.out.println(dan + "*" + row + "=" + dan * row));

👉🏻 Observable.range(start,count)는 start숫자부터 count 개수만큼의 숫자 값을 발행

  1. 사용자 함수 정의하기
Scanner in = new Scanner(System in);
System.out.println("Gugudan Input:");
int dan = Integer.parseInt(in.nextLine());

Function<Integer, Observable<String>> gugudan = num ->
	Observable.range(1,9).map(row -> num + "*" + row + " = " + num*row);
Observable<String> source = Observable.just(dan).flapMap(gugudan)
source.subscribe(System.out::println);

→ map() 함수는 값 1개를 입력받아서 1개의 결과만 만들어내므로 , flapMap() 함수를 활용

한 개의 결과값을 입력받아서 여러 개의 결과를 출력해야 하는 경우

  1. 좀 더 활용해보기
Observable<String> source = Observable.just(dan)
	.flatMap(num -> Obserable.range(1,9)
	.map(row -> num + "*" + row + "=" + dan*row));

좋은 웹페이지 즐겨찾기