일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 베드테이블
- 1일1커밋
- 어떻게 나답게 살 것인가
- 프래그먼트
- 아비투스
- 캐치마인드
- 좌식테이블
- 면접
- 브런치작가되기
- 목적중심리더십
- 안드로이드
- 커스텀린트
- 베드트레이
- 한달독서
- 재택근무
- 테트리스
- 자취필수템
- T자형인재
- 소프시스 밤부 좌식 엑슬 테이블
- 한달어스
- 함수형 프로그래밍
- 한달브런치북만들기
- 지지않는다는말
- 한단어의힘
- 북한살둘레길
- 목적 중심 리더십
- 끝말잇기
- 소프시스
- 슬기로운 온라인 게임
- 리얼하다
- Today
- Total
정상에서 IT를 외치다
[리액티브 프로그래밍] 리액티브 연산자 입문 본문
안녕하세요. 블랙진입니다.
한빛미디어 RxJava프로그래밍을 보며 리액티브를 공부한 내용을 정리하기 위한 두번째 포스팅입니다.
Chapter 3
3.1 Map() 함수
/**
* Map 함수는 입력값을 어떤 함수에 넣어서 원하는 값으로 변환하는 함수
*/
public void getStarMap() {
String[] balls = {"1","2","3","4"};
Observable<String> source = Observable.fromArray(balls)
.map(ball -> ball + "☆");
source.subscribe(System.out::println);
}
public void getStarMap() {
String[] balls = {"1","2","3","4"};
Function<String, String> getStar = ball -> ball + "☆";
Observable<String> source = Observable.fromArray(balls)
.map(getStar);
source.subscribe(System.out::println);
}
(결과)
main: 1☆
main: 2☆
main: 3☆
main: 4☆
Map() 함수의 원형
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
@CheckReturnVale 는 반환값을 확인한다는 의미입니다.
@SchedulerSuppoer(value="none") 는 스케줄러를 지원하지 않는다는 의미입니다. 즉 현재 스레드에서 실행합니다.
Function<? super T, ? extends R> mapper
Function<T, R> 은 T(입력) 값을 받아서 R(결과) 를 반환합니다.
3.2 flatMap() 함수
/**
* FlatMap 함수는 결과가 Observable 로 나옵니다.
* 일대다 혹은 일대일 Observable 함수입니다.
*/
public void getDoubleStartMap() {
Function<String, Observable<String>> getDoubleStart =
ball -> Observable.just(ball + "☆", ball + "☆");
String[] balls = {"1","2","3"};
Observable<String> source = Observable.fromArray(balls)
.flatMap(getDoubleStart);
source.subscribe(System.out::println);
}
(결과)
main: 1☆
main: 1☆
main: 2☆
main: 2☆
main: 3☆
main: 3☆
3.3 filter() 함수
/**
* Observable 에서 원하는 데이터만 걸러내는 역활
*/
public void getCircleFilter() {
String[] objs = {"1 CIRCLE","2 DIAMOND","3 TRIANGLE","4 CIRCLE","5 DIAMOND","6 TRIANGLE"};
Observable<String> source = Observable.fromArray(objs)
.filter(obj -> obj.endsWith("CIRCLE"));
source.subscribe(System.out::println);
}
filter() 함수와 비슷한 함수들
Integer[] numbers = {100, 200, 300, 400, 500};
Single<Integer> single;
Observable<Integer> source;
// 1. first - Observable의 첫 번째 값을 필터함. 만약 값없이 완료되면 대신 기본값을 리턴함
single = Observable.fromArray(numbers).first(-1);
single.subscribe(data -> System.out.println("first() value = " + data));
// 2. last - Observable의 마지막 값을 필터함. 만약 값없이 완료되면 대신 기본값을 리턴함
single = Observable.fromArray(numbers).last(999);
single.subscribe(data -> System.out.println("last() value = " + data));
// 3. take - 최초 N개 값만 가져옴
source = Observable.fromArray(numbers).take(3);
source.subscribe(data -> System.out.println("take(3) value = " + data));
// 4. takeLast - 마지막 N개 값만 필터함
source = Observable.fromArray(numbers).takeLast(3);
source.subscribe(data -> System.out.println("takeLast(3) value = " + data));
// 5. skip - 최초 N개 값을 건너뜀
source = Observable.fromArray(numbers).skip(2);
source.subscribe(data -> System.out.println("skip(2) value = " + data));
// 5. skipLast - 마지막 N개 값을 건너띔
source = Observable.fromArray(numbers).skipLast(2);
source.subscribe(data -> System.out.println("skipLast(2) value = " + data));
(결과)
first() value = 100
last() value = 500
take(3) value = 100
take(3) value = 200
take(3) value = 300
takeLast(3) value = 300
takeLast(3) value = 400
takeLast(3) value = 500
skip(2) value = 300
skip(2) value = 400
skip(2) value = 500
skipLast(2) value = 100
skipLast(2) value = 200
skipLast(2) value = 300
3.4 reduce() 함수
/**
* reduce() 함수는 발행한 데이터를 모두 사용하여 어떤 최종 결과 데이터를 합성할 때 활용
*/
public class ReduceExample {
public void example() {
String[] balls = {"1", "3", "5"};
Maybe<String> source = Observable.fromArray(balls)
.reduce((ball1, ball2) -> ball2 + "(" + ball1 + ")");
source.subscribe(System.out::println);
}
}
(결과)
5(3(1))
3.4.1 데이터 쿼리하기
/**
* TV : 2500
* Camera : 300
* TV : 1600
* Phone : 800
*
* 1. 전체 매출 데이터를 입력함.
* 2. 매출 데이터 중 TV 매출을 필터링 함
* 3. TV 매출의 합을 구함
*/
(결과)
// 1. 데이터 입력
item[] data = {new item("TV", 2500), new item("Camera", 300),
new item("TV", 1600), new item("Phone", 800)};
Maybe<Integer> tvSales = Observable.fromArray(data)
// 2. 매출 데이터 중 TV 매출을 필터링함
.filter(sale -> "TV".equals(sale.getName()))
.map(sale -> sale.getPrice())
// 3. TV 매출의 합을 구함
.reduce((sale1, sale2) -> sale1 + sale2);
tvSales.subscribe(tot -> System.out.println("TV Sales : $ : " + tot));
class item {
private String name;
private int price;
item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
'안드로이드' 카테고리의 다른 글
[Android, MVVM] ViewModel, LiveData, DataBinding, Koin 을 사용한 MVVM (3) | 2018.12.27 |
---|---|
[리액티브 프로그래밍] 리액티브 연산자의 활용 (0) | 2018.12.19 |
[리액티브 프로그래밍] 리액티브 프로그래밍 이란? (0) | 2018.12.18 |
[Android, Databinding] 데이터 바인딩 이벤트 처리 (0) | 2018.12.17 |
[번역] MVVM 디자인 패턴의 기본 이해 (0) | 2018.12.13 |