From 9c9fc3c6d8ad36afdda1424df5d191b86c61699d Mon Sep 17 00:00:00 2001 From: "voronkov.konstantin" Date: Mon, 16 May 2022 14:20:36 +0300 Subject: [PATCH] Voronkov.K. hw-1 --- src/main/kotlin/Main.kt | 61 +++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 18c0de6..7fb63a3 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,6 +1,4 @@ -import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.core.Maybe +import io.reactivex.rxjava3.core.* import java.rmi.server.ServerNotActiveException import java.util.* import java.util.concurrent.TimeUnit @@ -20,28 +18,56 @@ fun main() { // // Несмотря на то, что в некоторых заданиях фигурируют слова "синхронный" и "асинхронный" в рамках текущего ДЗ // это всего лишь имитация, реальное переключение между потоками будет рассмотрено на следующем семинаре + + println("1.0") + requestDataFromServerAsync().blockingSubscribe({println(it)},{println(it.message)}) + + println("2.0") + requestServerAsync().blockingSubscribe({println("complete")},{println(it.message)}) + + println("3.0") + requestDataFromDbAsync().blockingSubscribe({ println(it) }, { println("error: ${it.message}") }, { println("complete") }) + + println("4.0") + emitEachSecond() + + println("5.1") + xMap { flatMapCompletable(it) } + println("5.2") + xMap { concatMapCompletable (it) } + println("5.3") + xMap { switchMapCompletable(it) } + } // 1) Какой источник лучше всего подойдёт для запроса на сервер, который возвращает результат? +// Single // Почему? +// В Single возможны две ситуации: +// одно значение -> onSuccess() +// exception -> onError() // Дописать функцию -fun requestDataFromServerAsync() /* -> ??? */ { +fun requestDataFromServerAsync(): Single { // Функция имитирует синхронный запрос на сервер, возвращающий результат fun getDataFromServerSync(): ByteArray? { - Thread.sleep(LATENCY); + Thread.sleep(LATENCY) val success = Random.nextBoolean() return if (success) Random.nextBytes(RESPONSE_LENGTH) else null } - /* return ??? */ + return Single.fromCallable { + getDataFromServerSync() + } } // 2) Какой источник лучше всего подойдёт для запроса на сервер, который НЕ возвращает результат? +// Completable // Почему? +// Либо успешно завершает свою работу без каких-либо данных, либо бросает исключение. // Дописать функцию -fun requestServerAsync() /* -> ??? */ { +fun requestServerAsync(): Completable { // Функция имитирует синхронный запрос на сервер, не возвращающий результат fun getDataFromServerSync() { @@ -49,20 +75,26 @@ fun requestServerAsync() /* -> ??? */ { if (Random.nextBoolean()) throw ServerNotActiveException() } - /* return ??? */ + return Completable.fromAction { + getDataFromServerSync() + } } // 3) Какой источник лучше всего подойдёт для однократного асинхронного возвращения значения из базы данных? +// Maybe // Почему? +// может либо содержать элемент, либо выдать ошибку, либо не содержать данных - что вполне рационально для бд // Дописать функцию -fun requestDataFromDbAsync() /* -> ??? */ { +fun requestDataFromDbAsync(): Maybe { // Функция имитирует синхронный запрос к БД не возвращающий результата fun getDataFromDbSync(): T? { Thread.sleep(LATENCY); return null } - /* return */ + return Maybe.fromAction { + getDataFromDbSync() + } } // 4) Примените к источнику оператор (несколько операторов), которые приведут к тому, чтобы элемент из источника @@ -77,7 +109,14 @@ fun emitEachSecond() { // Принтер fun printer(value: Long) = println("${Date()}: value = $value") - // code here + source() + .filter { + it % 2 == 0L + } + .map { + it / 2 + } + .blockingSubscribe(::printer) } // 5) Функция для изучения разницы между операторами concatMap, flatMap, switchMap