From a58e8ee9a957ee2a2d391d77edb059ee7c536e26 Mon Sep 17 00:00:00 2001 From: Sergey Tarasov Date: Wed, 23 Mar 2022 19:39:23 +0300 Subject: [PATCH] Homework #2 Sergey Tarasov --- .idea/misc.xml | 2 +- src/main/kotlin/Main.kt | 71 +++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 62269df..38167d7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 18c0de6..4b56e90 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 @@ -9,23 +7,49 @@ import kotlin.random.Random private const val LATENCY = 700L private const val RESPONSE_LENGTH = 2048 -fun main() { - // Функции можно вызывать отсюда для проверки - // для ДЗ лучше использовать blockingSubscribe вместо subscribe потому что subscribe подпишется на изменения, - // но изменения в большинстве случаев будут получены позже, чем выполнится функция main, поэтому в консоли ничего - // не будет выведено. blockingSubscribe работает синхронно, поэтому результат будет выведен в консоль - // - // В реальных программах нужно использовать subscribe или передавать данные от источника к источнику для - // асинхронного выполнения кода. - // - // Несмотря на то, что в некоторых заданиях фигурируют слова "синхронный" и "асинхронный" в рамках текущего ДЗ - // это всего лишь имитация, реальное переключение между потоками будет рассмотрено на следующем семинаре +fun main(args: Array) { + + // Домашнее задание №2 студента Сергея Тарасова + // Tasks 1, 2, 3 + println("Tasks 1, 2, 3\n**************") + for (i in 0..3) { + requestDataFromServerAsync() + .blockingSubscribe({ println("Success: $it") }, { println("Error: ${it.message}") }, + { println("Complete") }) + + requestServerAsync() + .blockingSubscribe({ println("Success") }, { println("Error: ${it.message}") }) + + requestDataFromDbAsync() + } + + // Task 4 + println("Task 4 \n**************") + emitEachSecond() + + // Task 5 + println("Task 5 \n**************") +// xMap { flatMapCompletable(it) } // закомментировал, т.к. код выполняется бесконечно + xMap { concatMapCompletable(it) } + xMap { switchMapCompletable(it) } } +// Функции можно вызывать отсюда для проверки +// для ДЗ лучше использовать blockingSubscribe вместо subscribe потому что subscribe подпишется на изменения, +// но изменения в большинстве случаев будут получены позже, чем выполнится функция main, поэтому в консоли ничего +// не будет выведено. blockingSubscribe работает синхронно, поэтому результат будет выведен в консоль +// +// В реальных программах нужно использовать subscribe или передавать данные от источника к источнику для +// асинхронного выполнения кода. +// +// Несмотря на то, что в некоторых заданиях фигурируют слова "синхронный" и "асинхронный" в рамках текущего ДЗ +// это всего лишь имитация, реальное переключение между потоками будет рассмотрено на следующем семинаре + // 1) Какой источник лучше всего подойдёт для запроса на сервер, который возвращает результат? // Почему? // Дописать функцию -fun requestDataFromServerAsync() /* -> ??? */ { + +fun requestDataFromServerAsync(): Maybe { // Функция имитирует синхронный запрос на сервер, возвращающий результат fun getDataFromServerSync(): ByteArray? { @@ -33,36 +57,36 @@ fun requestDataFromServerAsync() /* -> ??? */ { val success = Random.nextBoolean() return if (success) Random.nextBytes(RESPONSE_LENGTH) else null } - - /* return ??? */ + return Maybe.fromCallable { getDataFromServerSync() } } // 2) Какой источник лучше всего подойдёт для запроса на сервер, который НЕ возвращает результат? // Почему? // Дописать функцию -fun requestServerAsync() /* -> ??? */ { + +fun requestServerAsync(): Completable { // Функция имитирует синхронный запрос на сервер, не возвращающий результат fun getDataFromServerSync() { Thread.sleep(LATENCY) if (Random.nextBoolean()) throw ServerNotActiveException() } - - /* return ??? */ + return Completable.fromCallable { getDataFromServerSync() } } // 3) Какой источник лучше всего подойдёт для однократного асинхронного возвращения значения из базы данных? // Почему? // Дописать функцию -fun requestDataFromDbAsync() /* -> ??? */ { +fun requestDataFromDbAsync(): Unit { // Функция имитирует синхронный запрос к БД не возвращающий результата fun getDataFromDbSync(): T? { Thread.sleep(LATENCY); return null } - /* return */ + return Single.fromCallable { getDataFromDbSync() } + .blockingSubscribe({ println("Success: $it") }, { println("Error: ${it.message}") }) } // 4) Примените к источнику оператор (несколько операторов), которые приведут к тому, чтобы элемент из источника @@ -78,6 +102,7 @@ fun emitEachSecond() { fun printer(value: Long) = println("${Date()}: value = $value") // code here + source().filter{it % 2L == 0L}.map{it / 2L}.blockingSubscribe(::printer) } // 5) Функция для изучения разницы между операторами concatMap, flatMap, switchMap @@ -102,10 +127,8 @@ fun xMap(mapper: Flowable.(internalMapper: (Int) -> Completable) -> Complet println("${Date()}: start") Flowable.fromIterable(0..20) .mapper { iterableIndex -> - waitOneSecond() .doOnComplete { println("${Date()}: finished operation for iterable index $iterableIndex") } - } .blockingSubscribe() } \ No newline at end of file