#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