From a4a4e3f91dc8819343b9d5b964e42be9f6005083 Mon Sep 17 00:00:00 2001 From: "yaroslav.budanov" Date: Tue, 22 Mar 2022 23:07:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=97=20:=20=D0=AF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=20=D0=91=D1=83=D0=B4=D0=B0=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ src/main/kotlin/Main.kt | 71 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f3debd --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build +.gradle +.idea \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 18c0de6..1e5ef3d 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -20,13 +20,63 @@ fun main() { // // Несмотря на то, что в некоторых заданиях фигурируют слова "синхронный" и "асинхронный" в рамках текущего ДЗ // это всего лишь имитация, реальное переключение между потоками будет рассмотрено на следующем семинаре + + println("First task:") + requestDataFromServerAsync() + .blockingSubscribe( + { + println("Success") + println(it) + }, + { + println(it.message) + }, + { + println("Null") + } + ) + + println("Second task:") + requestServerAsync() + .blockingSubscribe( + { + println("Success") + }, + { + println("Error") + println(it.message) + } + ) + + println("Third task:") + requestDataFromDbAsync() + .blockingSubscribe( + { + println("Success") + println(it) + }, + { + println(it.message) + }, + { + println("Null") + } + ) + + println("Fourth task:") +// emitEachSecond(); + + println("Fifth task:") + xMap { flatMapCompletable(it) } + xMap { concatMapCompletable(it) } + xMap { switchMapCompletable(it) } } // 1) Какой источник лучше всего подойдёт для запроса на сервер, который возвращает результат? // Почему? +// Maybe т.к. кроме результата ожидается возвращение пустого ответа (null) // Дописать функцию -fun requestDataFromServerAsync() /* -> ??? */ { - +fun requestDataFromServerAsync(): Maybe { // Функция имитирует синхронный запрос на сервер, возвращающий результат fun getDataFromServerSync(): ByteArray? { Thread.sleep(LATENCY); @@ -34,14 +84,15 @@ fun requestDataFromServerAsync() /* -> ??? */ { return if (success) Random.nextBytes(RESPONSE_LENGTH) else null } - /* return ??? */ + return Maybe.fromCallable { getDataFromServerSync() } } // 2) Какой источник лучше всего подойдёт для запроса на сервер, который НЕ возвращает результат? // Почему? +// Completable т.к. не важен результат, важен лишь факт выполнения запроса (с ошибкой или без) // Дописать функцию -fun requestServerAsync() /* -> ??? */ { +fun requestServerAsync(): Completable { // Функция имитирует синхронный запрос на сервер, не возвращающий результат fun getDataFromServerSync() { @@ -49,20 +100,22 @@ fun requestServerAsync() /* -> ??? */ { if (Random.nextBoolean()) throw ServerNotActiveException() } - /* return ??? */ + return Completable.fromCallable { getDataFromServerSync() } + } // 3) Какой источник лучше всего подойдёт для однократного асинхронного возвращения значения из базы данных? // Почему? +// Maybe т.к. кроме результата ожидается возвращение пустого ответа (null) // Дописать функцию -fun requestDataFromDbAsync() /* -> ??? */ { +fun requestDataFromDbAsync(): Maybe { // Функция имитирует синхронный запрос к БД не возвращающий результата fun getDataFromDbSync(): T? { Thread.sleep(LATENCY); return null } - /* return */ + return Maybe.fromCallable { getDataFromDbSync() } } // 4) Примените к источнику оператор (несколько операторов), которые приведут к тому, чтобы элемент из источника @@ -78,6 +131,10 @@ 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