👍2
Вопрос с собеседований
Что такое fail-fast и fail-safe итераторы?🤓
Ответ:
Fail-fast итераторы (например, у ArrayList, HashMap) выбрасывают ConcurrentModificationException, если коллекция изменилась во время обхода.
Fail-safe (например, у CopyOnWriteArrayList) работают с копией коллекции и не падают, но дороже по памяти.
#собеседование
Что такое fail-fast и fail-safe итераторы?
Ответ:
Fail-safe (например, у CopyOnWriteArrayList) работают с копией коллекции и не падают, но дороже по памяти.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Па́вел Вале́рьевич Ду́ров (род. 10 октября 1984, Ленинград, РСФСР, СССР) — российский предприниматель в сфере информационных технологий, основатель социальной сети «ВКонтакте» и кроссплатформенного мессенджера Telegram. В 2006 году вместе с братом Николаем Дуровым основал социальную сеть «ВКонтакте», которая быстро стала самой популярной соцсетью в России и многих странах СНГ. В 2014 году, после конфликта с новыми владельцами компании и давления со стороны российских властей, Дуров покинул пост генерального директора «ВКонтакте» и уехал из России.
Чжимин Лю ( кит .刘志明, родился 10 октября 1961 года в провинции Хэбэй , Китай) — китайско-британский информатик, известный своими работами по надёжному и трансформационному программированию (fault-tolerant programming by transformations).
Марк Снир (р. 10 октября 1948) — израильско-американский учёный, внёсший вклад в работу с параллельными системами и суперкомпьютерами, участвовал в разработке Blue Gene.
2006 — Начала работу социальная сеть «ВКонтакте».
#Biography #Birth_Date #Events #10Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Вот вы устроились IT-шником. Что нужно делать чтобы вас не сократили? 😉
Anonymous Poll
30%
Хорошо работать
41%
Иметь высокие экспертизы и стать незаменимым
3%
Пообещать засудить компанию
16%
Лизать зад тимлиду
11%
Подкармливать всех, в том числе и руководство, в офисе пончиками
👍1 1
Реактивное программирование
Обработка ошибок в реактивных стримах
Представьте ошибки как пороги в потоке событий: без обработки они останавливают течение, но с правильными операторами — поток продолжается, минимизируя простои. Это решает проблемы из первого поста: вместо жёстких сбоев в потоках или Future, где ошибка рушит всё, реактивный подход даёт контроль и устойчивость.
Обработка ошибок в Reactor строится на жизненном цикле: когда исключение возникает в потоке (в map, flatMap или источнике), срабатывает onError, прерывая onNext и onComplete. Но вместо того чтобы "падать", вы можете трансформировать ошибку в данные, повторить попытку или логировать.
Операторы — декларативные: добавляете в цепочку, и Reactor управляет асинхронностью, backpressure и распространением ошибок. Это делает код resilient (устойчивым): приложение не крашится, а адаптируется.
Базовая реакция: doOnError и onErrorMap
Сначала — простые операторы для наблюдения и модификации ошибок, без изменения потока.
- doOnError: дополнительная реакция на ошибку, как "хук" (зацепка). Полезен для логирования или метрик, не влияет на основной onError.
- onErrorMap: преобразует исключение в другое, для кастомизации (например, оборачивает в бизнес-ошибку).
Пример на Flux:
На Mono: аналогично, но для одиночного элемента.
Эти операторы решают проблему традиционных try-catch: вместо разбросанных блоков, всё в конвейере, читаемо и централизовано.
Восстановление: onErrorReturn и onErrorResume
Когда ошибка — не конец света, используйте fallback.
- onErrorReturn: возвращает фиксированное значение вместо ошибки. Простой запасной вариант.
- onErrorResume: более гибкий — заменяет ошибку новым Publisher (Mono/Flux). Можно генерировать динамически, в зависимости от исключения.
Пример с onErrorReturn:
С onErrorResume — условно:
onErrorResume позволяет ветвление: проверь тип ошибки и верни альтернативный поток. Это асинхронно: если fallback — Mono.delay, оно подождёт без блокировки.
Почему лучше CompletableFuture.handle?
Нет вложенных колбэков — цепочка линейна, ошибки интегрированы в конвейер.
#Java #middle #Reactor #doOnError #onErrorMap
Обработка ошибок в реактивных стримах
Представьте ошибки как пороги в потоке событий: без обработки они останавливают течение, но с правильными операторами — поток продолжается, минимизируя простои. Это решает проблемы из первого поста: вместо жёстких сбоев в потоках или Future, где ошибка рушит всё, реактивный подход даёт контроль и устойчивость.
Обработка ошибок в Reactor строится на жизненном цикле: когда исключение возникает в потоке (в map, flatMap или источнике), срабатывает onError, прерывая onNext и onComplete. Но вместо того чтобы "падать", вы можете трансформировать ошибку в данные, повторить попытку или логировать.
Операторы — декларативные: добавляете в цепочку, и Reactor управляет асинхронностью, backpressure и распространением ошибок. Это делает код resilient (устойчивым): приложение не крашится, а адаптируется.
Базовая реакция: doOnError и onErrorMap
Сначала — простые операторы для наблюдения и модификации ошибок, без изменения потока.
- doOnError: дополнительная реакция на ошибку, как "хук" (зацепка). Полезен для логирования или метрик, не влияет на основной onError.
- onErrorMap: преобразует исключение в другое, для кастомизации (например, оборачивает в бизнес-ошибку).
Пример на Flux:
import reactor.core.publisher.Flux;
import java.io.IOException;
Flux<String> riskyFlux = Flux.just("данные1", "данные2").map(data -> {
if (data.equals("данные2")) throw new IOException("Сбой ввода-вывода");
return data.toUpperCase();
});
riskyFlux
.doOnError(e -> System.err.println("Лог: " + e.getMessage())) // Логируем
.onErrorMap(e -> new RuntimeException("Обёрнутая ошибка: " + e)) // Преобразуем
.subscribe(
System.out::println,
error -> System.err.println("Финальная ошибка: " + error) // onError в подписке
);
// Вывод: "ДАННЫЕ1", потом лог "Сбой ввода-вывода", и финальная "Обёрнутая ошибка: ..."
Здесь doOnError срабатывает перед onErrorMap, а подписка ловит модифицированную ошибку. Это асинхронно: если ошибка в асинхронном подпотоке (flatMap), Reactor передаёт её downstream (дальше по цепи) без блокировок.
На Mono: аналогично, но для одиночного элемента.
Эти операторы решают проблему традиционных try-catch: вместо разбросанных блоков, всё в конвейере, читаемо и централизовано.
Восстановление: onErrorReturn и onErrorResume
Когда ошибка — не конец света, используйте fallback.
- onErrorReturn: возвращает фиксированное значение вместо ошибки. Простой запасной вариант.
- onErrorResume: более гибкий — заменяет ошибку новым Publisher (Mono/Flux). Можно генерировать динамически, в зависимости от исключения.
Пример с onErrorReturn:
Mono<String> httpMono = Mono.fromCallable(() -> {
// Симулируем HTTP-запрос
throw new RuntimeException("Сервер не отвечает");
}).onErrorReturn("Кэшированные данные");
httpMono.subscribe(System.out::println); // Вывод: "Кэшированные данные", потом onComplete
Здесь ошибка преобразуется в значение, поток завершается успешно.
С onErrorResume — условно:
Flux<Integer> calcFlux = Flux.range(1, 5).map(i -> {
if (i == 3) throw new ArithmeticException("Деление на ноль");
return 10 / (i - 3); // Симуляция
}).onErrorResume(e -> {
if (e instanceof ArithmeticException) {
return Flux.just(0, 0); // Fallback на нули
} else {
return Flux.error(e); // Пропустить другие ошибки
}
});
calcFlux.subscribe(System.out::println); // Вывод: элементы до ошибки, потом 0, 0, onComplete
onErrorResume позволяет ветвление: проверь тип ошибки и верни альтернативный поток. Это асинхронно: если fallback — Mono.delay, оно подождёт без блокировки.
Почему лучше CompletableFuture.handle?
Нет вложенных колбэков — цепочка линейна, ошибки интегрированы в конвейер.
#Java #middle #Reactor #doOnError #onErrorMap
👍2
Retry: повтор попыток при ошибке
Retry — для transient (временных) ошибок: сеть, временный сбой. Повторяет upstream (источник) заданное число раз.
- retry(long times): простая повторка.
- retryWhen(Retry strategy): с кастомной логикой (backoff — задержка, условия).
Пример базовый:
С retryWhen для экспоненциальной задержки (backoff):
Это предотвращает "молоток" (hammering) сервера: ждёт перед retry. Асинхронно: задержки не блокируют поток.
Retry решает боли блокировок: вместо цикла с sleep в традиционном коде, декларативно и эффективно.
Практические советы и подводные камни
- Комбинируйте: riskyFlux.doOnError(log).onErrorResume(fallback).retry(2) — лог + retry + fallback.
- Условия: в onErrorResume используйте instanceof для типов ошибок, чтобы не catch всё подряд.
- Глобально: используйте Hooks.onErrorDropped для непойманных ошибок (редко).
- Камень: retry на бесконечных потоках — вечный цикл; добавьте timeout() или maxAttempts.
- Тестирование: StepVerifier.create(flux).expectErrorMatches(e -> e instanceof IOException).verify();
В практике: в WebFlux — контроллер возвращает Mono с retry для внешних API, onErrorReturn для кэша.
плавному восстановлению, экономя ресурсы и упрощая код.
#Java #middle #Reactor #doOnError #onErrorMap
Retry — для transient (временных) ошибок: сеть, временный сбой. Повторяет upstream (источник) заданное число раз.
- retry(long times): простая повторка.
- retryWhen(Retry strategy): с кастомной логикой (backoff — задержка, условия).
Пример базовый:
Mono<String> flakyMono = Mono.defer(() -> {
if (Math.random() > 0.3) throw new RuntimeException("Временный сбой");
return Mono.just("Успех");
}).retry(3); // Повторить 3 раза
flakyMono.subscribe(System.out::println, Throwable::printStackTrace);
Здесь retry повторяет весь Mono при ошибке, до успеха или исчерпания попыток. Если все попытки fail — финальный onError.
С retryWhen для экспоненциальной задержки (backoff):
import reactor.util.retry.Retry;
flakyMono.retryWhen(Retry.backoff(3, Duration.ofSeconds(1))); // 3 попытки с задержкой 1с, 2с, 4с
Это предотвращает "молоток" (hammering) сервера: ждёт перед retry. Асинхронно: задержки не блокируют поток.
Retry решает боли блокировок: вместо цикла с sleep в традиционном коде, декларативно и эффективно.
Практические советы и подводные камни
- Комбинируйте: riskyFlux.doOnError(log).onErrorResume(fallback).retry(2) — лог + retry + fallback.
- Условия: в onErrorResume используйте instanceof для типов ошибок, чтобы не catch всё подряд.
- Глобально: используйте Hooks.onErrorDropped для непойманных ошибок (редко).
- Камень: retry на бесконечных потоках — вечный цикл; добавьте timeout() или maxAttempts.
- Тестирование: StepVerifier.create(flux).expectErrorMatches(e -> e instanceof IOException).verify();
В практике: в WebFlux — контроллер возвращает Mono с retry для внешних API, onErrorReturn для кэша.
плавному восстановлению, экономя ресурсы и упрощая код.
#Java #middle #Reactor #doOnError #onErrorMap
👍2
Что выведет код?
#Tasks
import reactor.core.publisher.Mono;
public class MonoExample {
public static void main(String[] args) {
Mono.just("Start")
.doOnNext(System.out::print)
.then(Mono.fromRunnable(() -> System.out.print("Middle")))
.thenReturn("End")
.subscribe(System.out::print);
}
}
#Tasks
👍1
Вопрос с собеседований
Чем отличается LinkedHashMap от HashMap?🤓
Ответ:
LinkedHashMap сохраняет порядок вставки элементов (или порядок доступа при включённом режиме accessOrder).
HashMap порядок не гарантирует.
LinkedHashMap удобен для кэшей, когда важен порядок добавления или использования.
#собеседование
Чем отличается LinkedHashMap от HashMap?
Ответ:
HashMap порядок не гарантирует.
LinkedHashMap удобен для кэшей, когда важен порядок добавления или использования.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Александр Андреевич Кузнецов (11 октября 1944 года — 6 января 2022 года, Москва, Россия) — советский и российский учёный-педагог, академик РАО (1999), вице-президент РАО. Более 30 лет проработал в Институте содержания и методов обучения РАО, где возглавлял лабораторию дидактики информатики, являлся академиком-секретарём Отделения общего среднего образования РАО, впоследствии был избран вице-президентом Российской академии образования.
1961 — на Семипалатинском полигоне осуществлён первый подземный ядерный взрыв.
1999 — Британский астроном Джон Мюррей (John Murray), исходя из своих расчётов, заявил, что вокруг Солнца по десятой орбите движется огромная планета, по размерам больше Юпитера.
#Biography #Birth_Date #Events #11Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
С 04.10 по 10.10
Предыдущий пост(с 27.09 по 03.10)
Воскресный мотивационный пост:
А сколько вы жмете от груди?
Выбранная голосованием тема:
Аспектно-ориентированное программирование в Java (AOP)
Запись встреч/видео:
Не проводилось
Обучающие статьи:
Реактивное программирование
Базовые операторы в Reactor: map, filter, flatMap
Комбинации потоков в Reactor: concat, merge и другие
Обработка ошибок в реактивных стримах
Java:
Коллекции в Java
Глава 3. Set — множества
Интерфейс Set. Особенности множеств
Реализации: HashSet, LinkedHashSet, TreeSet
Полезные статьи и видео:
Защита своего приложения с помощью JWT и Spring Security
Идемпотентность: больше, чем кажется
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Предыдущий пост(с 27.09 по 03.10)
Воскресный мотивационный пост:
А сколько вы жмете от груди?
Выбранная голосованием тема:
Аспектно-ориентированное программирование в Java (AOP)
Запись встреч/видео:
Не проводилось
Обучающие статьи:
Реактивное программирование
Базовые операторы в Reactor: map, filter, flatMap
Комбинации потоков в Reactor: concat, merge и другие
Обработка ошибок в реактивных стримах
Java:
Коллекции в Java
Глава 3. Set — множества
Интерфейс Set. Особенности множеств
Реализации: HashSet, LinkedHashSet, TreeSet
Полезные статьи и видео:
Защита своего приложения с помощью JWT и Spring Security
Идемпотентность: больше, чем кажется
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4