From 0c4cab4a37b557228aa91d995c4d7be47d39c715 Mon Sep 17 00:00:00 2001 From: ilein Date: Wed, 23 Mar 2022 04:54:59 +0500 Subject: [PATCH] Bobrova L (HW 1) --- src/main/kotlin/Main.kt | 50 +++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 18c0de6..9a5f4ea 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,6 +1,8 @@ + import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe +import io.reactivex.rxjava3.core.Observable import java.rmi.server.ServerNotActiveException import java.util.* import java.util.concurrent.TimeUnit @@ -20,12 +22,30 @@ fun main() { // // Несмотря на то, что в некоторых заданиях фигурируют слова "синхронный" и "асинхронный" в рамках текущего ДЗ // это всего лишь имитация, реальное переключение между потоками будет рассмотрено на следующем семинаре + + //1 + println("1:") + requestDataFromServerAsync().blockingSubscribe({println("$it")}, {println("Error")}) + //2 + println("2:") + requestServerAsync().blockingSubscribe({println("OK")}, {println("Error")}) + //3 + println("3:") + requestDataFromDbAsync().blockingSubscribe({println("$it")}, {println("Error")}, {println("Complete")}) + //4 + println("4: ") + emitEachSecond() + //5 + xMap { flatMapCompletable(it) } // когда все закончатся + xMap { concatMapCompletable (it) } // друг за другом + xMap { switchMapCompletable(it) } // самый новый + } // 1) Какой источник лучше всего подойдёт для запроса на сервер, который возвращает результат? -// Почему? +// Почему? = Observable, отдает данные // Дописать функцию -fun requestDataFromServerAsync() /* -> ??? */ { +fun requestDataFromServerAsync(): Observable { // Функция имитирует синхронный запрос на сервер, возвращающий результат fun getDataFromServerSync(): ByteArray? { @@ -34,14 +54,14 @@ fun requestDataFromServerAsync() /* -> ??? */ { return if (success) Random.nextBytes(RESPONSE_LENGTH) else null } - /* return ??? */ + return Observable.fromCallable{ getDataFromServerSync() } } // 2) Какой источник лучше всего подойдёт для запроса на сервер, который НЕ возвращает результат? -// Почему? +// Почему? = Completable - Он ничего не испускает // Дописать функцию -fun requestServerAsync() /* -> ??? */ { +fun requestServerAsync(): Completable { // Функция имитирует синхронный запрос на сервер, не возвращающий результат fun getDataFromServerSync() { @@ -49,20 +69,21 @@ fun requestServerAsync() /* -> ??? */ { if (Random.nextBoolean()) throw ServerNotActiveException() } - /* return ??? */ + return Completable.fromCallable { getDataFromServerSync() } } // 3) Какой источник лучше всего подойдёт для однократного асинхронного возвращения значения из базы данных? -// Почему? +// Почему? Maybe - либо есть значение либо нет // Дописать функцию -fun requestDataFromDbAsync() /* -> ??? */ { +fun requestDataFromDbAsync(): Maybe { // Функция имитирует синхронный запрос к БД не возвращающий результата fun getDataFromDbSync(): T? { Thread.sleep(LATENCY); return null } - /* return */ + return Maybe.fromCallable { getDataFromDbSync() } + //.blockingSubscribe({ t = it}, {println("Error")}, {println("Complete")}) } // 4) Примените к источнику оператор (несколько операторов), которые приведут к тому, чтобы элемент из источника @@ -78,6 +99,14 @@ fun emitEachSecond() { fun printer(value: Long) = println("${Date()}: value = $value") // code here + fun sleepOneSec(value: Long): Long { + Thread.sleep(1000) + return value + } + + //source().doAfterNext { Thread.sleep(1000) }.blockingSubscribe(::printer) + source().map { t -> sleepOneSec(t) }.blockingSubscribe(::printer) + } // 5) Функция для изучения разницы между операторами concatMap, flatMap, switchMap @@ -95,6 +124,9 @@ fun emitEachSecond() { // xMap { concatMapCompletable (it) } // xMap { switchMapCompletable(it) } // +// xMap { flatMapCompletable(it) } // когда все закончатся +// xMap { concatMapCompletable (it) } // друг за другом +// xMap { switchMapCompletable(it) } // самый новый fun xMap(mapper: Flowable.(internalMapper: (Int) -> Completable) -> Completable) { fun waitOneSecond() = Completable.timer(1, TimeUnit.SECONDS)