Save the Reactor - фантастический симулятор смотрителя за ядерным реактором от студии Hypnohead. Save the Reactor - это хардкорнай тайм-менеджмент тактика, в которой нам предстоит работать смотрителем ядерного реактора в режиме жесткой многозадачности. Нарушение сроков, нажатие не тех кнопок и прочие ошибки караются очень строго. У вас есть более 40 панелей, которые активируются совершенно по-разному. Save the Reactor в Steam ВК-паблик разработчика Ставь лайк, подписывайся на каталог Игры из России, чтобы не пропустить ни одну и знать наших!
🔋Основы реактивного программирования Reactor Reactor — это библиотека реактивного программирования для создания асинхронных и событийно-управляемых приложений на языке Java. Она предназначена для масштабируемой и эффективной обработки больших объемов потоков данных и событий. Я сам пользовался Reactor, и поэтому решил предложить вам эту простую и доступную для новичков библиотеку в демонстрационных целях. Основное назначение Reactor — предоставление набора инструментов и абстракций для создания реактивных приложений. Reactor предлагает набор основных компонентов, таких как Flux и Mono, которые представляют собой потоки данных и событий. Эти компоненты могут быть объединены и преобразованы с помощью набора операторов, таких как map, filter и reduce, для создания сложных потоков данных. Сравнение Mono и Flux Как уже говорилось, реактивное программирование работает по модели “издатель-подписчик”. И Mono, и Flux предоставляют абстракцию для публикации событий. Разница между ними заключается в том, что Mono может публиковать только одно событие за раз, а Flux — несколько событий за раз. Поэтому когда нужно публиковать только одно событие, выбирают Mono, а когда нужно публиковать несколько событий — Flux. Теперь приведу небольшой пример, поясняющий каждую упоминаемую ранее концепцию. Демо Все начинается с того, что издатель выдает событие для потребителя. Как и java-потоки, Flux и Mono придерживаются ленивого выполнения, т.е. значение выражения не обрабатывается до тех пор, пока в нем нет необходимости. Начнем с создания простого Flux. Flux<Integer> flux = Flux.just(1, 2, 3, 4, 5); Метод “just” позволяет создать Flux, если есть доступное значение. Это самый простой способ создания Flux. Несмотря на то что я привожу пример с Flux, шаги остаются такими же и для Mono. В Mono также используется метод “just” с той разницей, что Mono применяется только для одного элемента. Поэтому если задать несколько значений, то получим ошибку. Flux<String> mappedFlux = flux.map(i -> "Number: " + i) The above flux gets converted to "Number: 1", "Number: 2", "Number: 3", "Number: 4", "Number: 5" Здесь был использован оператор для обработки данных. Как вы помните, я уже упоминал об операторах. Теперь хотел бы перечислить несколько распространенных операторов. 1. Map: преобразует каждый элемент, выдаваемый потоком данных, применяя к нему функцию. 2. Filter: фильтрует элементы, выдаваемые потоком данных, на основе предикатной функции. 3. Reduce: агрегирует элементы, выдаваемые потоком данных, в одно значение с помощью функции-аккумулятора. 4. Merge: объединяет несколько потоков данных в один. 5. Concat: конкатенирует нескольких потоков данных в один в определенном порядке. 6. FlatMap: преобразует каждый элемент, выдаваемый потоком данных, в другой поток данных, а затем сводит полученные потоки в один. 7. Zip: объединяет элементы, выдаваемые несколькими потоками данных, в один элемент с помощью функции-комбинатора. Применим еще несколько операторов для пояснения их работы. Flux<String> filteredFlux = mappedFlux.filter(s -> !s.endsWith("2") && !s.endsWith("4")); Flux преобразуется в: "Number: 1", "Number: 3", "Number: 5" Теперь сведем Flux к одной строке. Mono<String> reducedMono = filteredFlux.reduce("", (a, b) -> a+ ", " + b); Flux преобразуется в: "Number: 1, Number: 3, Number: 5" Эти шаги представляют собой обработку события. Мы начали с исходного события Flux, состоящего из списка чисел, и использовали операторы для обработки событий. *️⃣Следует отметить, что я добавил преобразованный вывод для пояснения, а на самом деле никаких вычислений не происходит. Как уже говорилось, Flux следует модели ленивого исполнения. Пока мы не подпишемся на поток событий, никаких вычислений не происходит. А когда подписываемся, получаем возможность контролировать то, что нужно сделать с полученным событием. Чтобы упростить задачу и показать, как работает подписчик, просто выведу Flux. 📌Читать @javarush