기록 - 리액티브 연산자(1)
1. map() 함수
- 입력값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수
- 입력 데이터와 그것을 변환해줄 함수를 이어주는 중개업자의 역할
String[] balls = {"1","2","3","5"};
Observable<String> source = Observable.fromArray(balls)
.map(ball -> ball + "💠");
source.subscribe(Log::i);
RxJava의 제네릭 함수형 인터페이스
인터페이스 이름 | 포함 메소드 | 설명 |
---|---|---|
Predicate | boolean test(T t) | t 값을 받아서 참이나 거짓을 반환합니다 |
Consumer | void 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() 함수를 이용하여 바꿔보기
- 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 개수만큼의 숫자 값을 발행
- 사용자 함수 정의하기
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() 함수를 활용
⇒ 한 개의 결과값을 입력받아서 여러 개의 결과를 출력해야 하는 경우
- 좀 더 활용해보기
Observable<String> source = Observable.just(dan)
.flatMap(num -> Obserable.range(1,9)
.map(row -> num + "*" + row + "=" + dan*row));
Author And Source
이 문제에 관하여(기록 - 리액티브 연산자(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ddyy094/RxJava기록-리액티브-연산자1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)