#36 rxjava: 데이터 변환 - concatmap, switchmap
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
RxJava/practice/src/main/java/org/example/ex10/Searcher.java
Normal file
22
RxJava/practice/src/main/java/org/example/ex10/Searcher.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user