#36 rxjava: 데이터 변환 - concatmap, switchmap

This commit is contained in:
haerong22
2023-05-26 23:46:46 +09:00
parent 3132be2e0e
commit 480b3eaf94
6 changed files with 211 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
package org.example.ex10;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
/**
* 순서를 보장해주는 concatMap 예제
* 순차적으로 실행되기때문에 flatMap보다 느리다.
*/
public class ObservableConcatMapEx01 {
public static void main(String[] args) {
TimeUtil.start();
Observable.interval(100L, TimeUnit.MILLISECONDS)
.take(4)
.skip(2)
.concatMap(
num -> Observable.interval(200L, TimeUnit.MILLISECONDS)
.take(10)
.skip(1)
.map(row -> num + " * " + row + " = " + num * row)
).subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> {},
() -> {
TimeUtil.end();
TimeUtil.takeTime();
}
);
TimeUtil.sleep(5000L);
}
}

View File

@@ -0,0 +1,36 @@
package org.example.ex10;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
/**
* concatMap과 달리 순서를 보장해주지 않는 flatMap의 예제
* 실행 속도가 concatMap 보다 빠르다.
*/
public class ObservableConcatMapEx02 {
public static void main(String[] args) {
TimeUtil.start();
Observable.interval(100L, TimeUnit.MILLISECONDS)
.take(4)
.skip(2)
.flatMap(
num -> Observable.interval(200L, TimeUnit.MILLISECONDS)
.take(10)
.skip(1)
.map(row -> num + " * " + row + " = " + num * row)
)
.subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> {},
() -> {
TimeUtil.end();
TimeUtil.takeTime();
});
TimeUtil.sleep(3000L);
}
}

View File

@@ -0,0 +1,30 @@
package org.example.ex10;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.concurrent.TimeUnit;
/**
* 원본 소스의 처리 속도가 빨라서 현재 처리 중이던 작업을 중단하는 예제
*/
public class ObservableSwitchMapEx01 {
public static void main(String[] args) throws InterruptedException {
System.out.println("# start : " + TimeUtil.getCurrentTimeFormatted());
Observable.interval(100L, TimeUnit.MILLISECONDS)
.take(4)
.skip(2)
.doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.switchMap(
num -> Observable.interval(300L, TimeUnit.MILLISECONDS)
.take(10)
.skip(1)
.map(row -> num + " * " + row + " = " + num * row)
)
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
Thread.sleep(5000);
}
}

View File

@@ -0,0 +1,44 @@
package org.example.ex10;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* switchMap 대신 concatMap을 쓸 경우 비효율적인 검색 예제
*/
public class ObservableSwitchMapEx02 {
public static void main(String[] args) {
TimeUtil.start();
Searcher searcher = new Searcher();
// 사용자가 입력하는 검색어라고 가정한다.
final List<String> keywords = Arrays.asList("M", "Ma", "Mal", "Malay");
Observable.interval(100L, TimeUnit.MILLISECONDS)
.take(4)
.concatMap(data -> { /** concatMap을 사용했기때문에 매번 모든 키워드 검색 결과를 다 가져온다.*/
String keyword = keywords.get(data.intValue()); // 데이터베이스에서 조회한다고 가정한다.
return Observable.just(searcher.search(keyword))
.doOnNext(notUse -> System.out.println("================================================================="))
.delay(1000L, TimeUnit.MILLISECONDS);
})
.flatMap(resultList -> Observable.fromIterable(resultList))
.subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> {},
() -> {
TimeUtil.end();
TimeUtil.takeTime();
}
);
TimeUtil.sleep(6000L);
}
}

View File

@@ -0,0 +1,43 @@
package org.example.ex10;
import io.reactivex.rxjava3.core.Observable;
import org.example.utils.LogType;
import org.example.utils.Logger;
import org.example.utils.TimeUtil;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* switchMap을 이용한 효율적인 키워드 검색 예제
*/
public class ObservableSwitchMapEx03 {
public static void main(String[] args) {
TimeUtil.start();
Searcher searcher = new Searcher();
// 사용자가 입력하는 검색어라고 가정한다.
final List<String> keywords = Arrays.asList("M", "Ma", "Mal", "Malay");
Observable.interval(100L, TimeUnit.MILLISECONDS)
.take(4)
.doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.switchMap(data -> { /** switchMap을 사용했기 때문에 마지막 키워드를 사용한 최신 검색 결과만 가져온다 */
String keyword = keywords.get(data.intValue()); // 데이터베이스에서 조회한다고 가정한다.
return Observable.just(searcher.search(keyword))
.delay(1000L, TimeUnit.MILLISECONDS);
})
.flatMap(resultList -> Observable.fromIterable(resultList))
.subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> {},
() -> {
TimeUtil.end();
TimeUtil.takeTime();
}
);
TimeUtil.sleep(2000L);
}
}

View File

@@ -0,0 +1,22 @@
package org.example.ex10;
import java.util.*;
public class Searcher {
public Map<String, List<String>> map = new HashMap<>();
{
map.put("M", Arrays.asList("Macau", "Malaysia", "Maldives", "Mexico", "Myanmar", "Macedonia"));
map.put("Ma", Arrays.asList("Macau", "Malaysia", "Maldives", "Macedonia"));
map.put("Mal", Arrays.asList("Malaysia", "Maldives"));
map.put("Malay", Arrays.asList("Malaysia"));
}
public List<String> search(String keyword){
List<String> results = map.get(keyword);
if(results == null){
results = new ArrayList<>();
}
return results;
}
}