Что выведет код?
#Tasks
public class Task081025 {
public static void main(String[] args) {
try {
System.out.print("A");
throw new RuntimeException();
} catch (RuntimeException e) {
System.out.print("B");
throw new NullPointerException();
} finally {
System.out.print("C");
throw new IllegalArgumentException();
}
}
}
#Tasks
👍2
Вопрос с собеседований
Что лучше: throw или return кода ошибки?🤓
Ответ:
В Java принято использовать исключения (throw), а не коды ошибок.
Исключения позволяют разделить бизнес-логику и обработку ошибок, делать код чище и поддерживаемее.
Коды ошибок уместны в низкоуровневых системах, но не в Java-приложениях.
#собеседование
Что лучше: throw или return кода ошибки?
Ответ:
Исключения позволяют разделить бизнес-логику и обработку ошибок, делать код чище и поддерживаемее.
Коды ошибок уместны в низкоуровневых системах, но не в Java-приложениях.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Джон Бёрдетт Гейдж (родился 9 октября 1942 года) — американский компьютерный учёный и технологический менеджер, один из ранних сотрудников Sun Microsystems, автор фразы «The Network is the Computer», занимал должность вице-президента по науке в Sun; ключевая фигура в развитии корпоративных ИТ-инфраструктур.
Джером Говард «Джерри» Солцер (родился 9 октября 1939 года) — американский специалист по компьютерным системам; участвовал в проектах Multics, Project Athena, известен влиянием на архитектуру систем безопасности и лицензии ПО.
1604 — первые наблюдения европейцами сверхновой звезды SN 1604 или Сверхновая Кеплера, вспыхнувшей в нашей Галактике в созвездии Змееносца.
#Biography #Birth_Date #Events #09Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Коллекции в Java
Глава 3. Set — множества
Реализации: HashSet, LinkedHashSet, TreeSet.
Применение множеств: удаление дубликатов, проверка уникальности
Интерфейс Set<E> имеет несколько реализаций в JCF, каждая оптимизирована под разные сценарии. Все они обеспечивают уникальность элементов, но отличаются по порядку, сортировке и времени операций.
HashSet<E>
Описание: HashSet — самая распространенная реализация Set, основанная на хэш-таблице (HashMap внутри). Она хранит элементы в "корзинах" (buckets) на основе их хэш-кода, что обеспечивает быстрый поиск и добавление.
Особенности:
Уникальность: Да, дубликаты игнорируются.
Порядок: Нет гарантированного порядка (зависит от хэша, может меняться при ресайзе).
Сортировка: Нет.
Null: Разрешен один null.
Big O: Средний случай — O(1) для add, remove, contains (константное время). Worst-case — O(n) при коллизиях хэшей, но редко с хорошим hashCode().
Внутренняя работа: Элементы хранятся как ключи в HashMap (значения — dummy объект). Хэш-код определяет бакет, equals() — проверку уникальности.
Нюансы:
Зависит от hashCode() и equals(): Плохо реализованные методы приводят к коллизиям и снижению производительности.
Ресайз: При заполнении >75% (load factor) таблица удваивается, что может занять O(n) времени.
Thread-safety: Не безопасен для многопоточности — используйте Collections.synchronizedSet(new HashSet<>()).
Память: Занимает больше, чем ArrayList, из-за хэш-таблицы.
Пример кода:
LinkedHashSet<E>
Расширение HashSet с двусвязным списком для сохранения порядка вставки. Внутри — HashMap с LinkedHashMap-логикой.
Особенности:
Уникальность: Да.
Порядок: Сохраняет порядок вставки (insertion order).
Сортировка: Нет.
Null: Разрешен один null.
Big O: O(1) для add/remove/contains (как HashSet), но с overhead на ссылки списка.
Внутренняя работа: Каждый элемент имеет ссылки prev/next для списка, плюс хэш-таблица для уникальности.
Нюансы:
Больше памяти, чем HashSet (из-за ссылок).
Итерация: O(n), но предсказуема по порядку вставки.
Полезен для кэшей с LRU (least recently used), но для простого порядка — эффективен.
Thread-safety: Нет, как у HashSet.
Пример кода:
#Java #для_новичков #beginner #Collections #HashSet #LinkedHashSet #TreeSet
Глава 3. Set — множества
Реализации: HashSet, LinkedHashSet, TreeSet.
Применение множеств: удаление дубликатов, проверка уникальности
Интерфейс Set<E> имеет несколько реализаций в JCF, каждая оптимизирована под разные сценарии. Все они обеспечивают уникальность элементов, но отличаются по порядку, сортировке и времени операций.
HashSet<E>
Описание: HashSet — самая распространенная реализация Set, основанная на хэш-таблице (HashMap внутри). Она хранит элементы в "корзинах" (buckets) на основе их хэш-кода, что обеспечивает быстрый поиск и добавление.
Особенности:
Уникальность: Да, дубликаты игнорируются.
Порядок: Нет гарантированного порядка (зависит от хэша, может меняться при ресайзе).
Сортировка: Нет.
Null: Разрешен один null.
Big O: Средний случай — O(1) для add, remove, contains (константное время). Worst-case — O(n) при коллизиях хэшей, но редко с хорошим hashCode().
Внутренняя работа: Элементы хранятся как ключи в HashMap (значения — dummy объект). Хэш-код определяет бакет, equals() — проверку уникальности.
Нюансы:
Зависит от hashCode() и equals(): Плохо реализованные методы приводят к коллизиям и снижению производительности.
Ресайз: При заполнении >75% (load factor) таблица удваивается, что может занять O(n) времени.
Thread-safety: Не безопасен для многопоточности — используйте Collections.synchronizedSet(new HashSet<>()).
Память: Занимает больше, чем ArrayList, из-за хэш-таблицы.
Пример кода:
javaimport java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> fruits = new HashSet<>();
fruits.add("Яблоко");
fruits.add("Банан");
fruits.add("Яблоко"); // Игнорируется
System.out.println(fruits.contains("Банан")); // true
fruits.remove("Яблоко");
for (String fruit : fruits) {
System.out.println(fruit); // Порядок непредсказуем, например: Банан
}
}
}
Вывод: contains вернет true, размер 1 после удаления, порядок случайный.
LinkedHashSet<E>
Расширение HashSet с двусвязным списком для сохранения порядка вставки. Внутри — HashMap с LinkedHashMap-логикой.
Особенности:
Уникальность: Да.
Порядок: Сохраняет порядок вставки (insertion order).
Сортировка: Нет.
Null: Разрешен один null.
Big O: O(1) для add/remove/contains (как HashSet), но с overhead на ссылки списка.
Внутренняя работа: Каждый элемент имеет ссылки prev/next для списка, плюс хэш-таблица для уникальности.
Нюансы:
Больше памяти, чем HashSet (из-за ссылок).
Итерация: O(n), но предсказуема по порядку вставки.
Полезен для кэшей с LRU (least recently used), но для простого порядка — эффективен.
Thread-safety: Нет, как у HashSet.
Пример кода:
javaimport java.util.LinkedHashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> fruits = new LinkedHashSet<>();
fruits.add("Яблоко");
fruits.add("Банан");
fruits.add("Апельсин");
for (String fruit : fruits) {
System.out.println(fruit); // Яблоко, Банан, Апельсин — порядок вставки
}
}
}
Вывод: Элементы в том порядке, в котором добавлены.
#Java #для_новичков #beginner #Collections #HashSet #LinkedHashSet #TreeSet
👍3
TreeSet<E>
Реализация SortedSet<E>, основанная на красно-черном дереве. Автоматически сортирует элементы.
Особенности:
Уникальность: Да.
Порядок: Нет (игнорирует порядок вставки), но отсортирован по натуральному порядку или Comparator.
Сортировка: Да, всегда отсортирован.
Null: Не разрешен (NullPointerException при сравнении).
Big O: O(log n) для add/remove/contains (дерево балансировано).
Внутренняя работа: Элементы хранятся в узлах дерева, сравниваются через Comparable.compareTo() или Comparator.
Нюансы:
Элементы должны реализовывать Comparable<E> или предоставить Comparator при создании: new TreeSet<>(comparator).
Для custom классов: Реализуйте Comparable или Comparator, иначе ClassCastException.
Итерация: O(n), в отсортированном порядке.
Дополнительные методы: first(), last(), headSet(E to), tailSet(E from) — для подмножеств.
Thread-safety: Нет, используйте Collections.synchronizedSortedSet(new TreeSet<>()).
Память: Больше, чем HashSet, из-за структуры дерева.
Пример кода:
Применение множеств: Удаление дубликатов и проверка уникальности
Множества идеальны для задач, где нужна уникальность без дубликатов.
Удаление дубликатов:
Преобразуйте List или массив в Set — дубликаты автоматически удалятся.
Нюанс: Порядок может потеряться (используйте LinkedHashSet для сохранения).
Пример кода:
Проверка уникальности:
Используйте contains() для быстрой проверки наличия (O(1) в HashSet).
Или add() — если false, элемент уже есть.
Нюанс: Для больших данных Set эффективнее, чем перебор List (O(n)).
Пример кода:
Полезные советы для новичков
HashSet по умолчанию: Для большинства случаев уникальности.
Custom классы: Всегда реализуйте equals() и hashCode() (используйте IDE: Generate → equals() and hashCode()).
Comparator в TreeSet: Для custom сортировки: new TreeSet<>((a, b) -> a.compareTo(b)).
Удаление дубликатов: Удобно для списков из файлов или БД.
Память: TreeSet дороже по памяти, HashSet — оптимален.
Ошибки: ClassCastException в TreeSet без Comparable; ConcurrentModificationException при модификации во время итерации (используйте Iterator.remove()).
#Java #для_новичков #beginner #Collections #HashSet #LinkedHashSet #TreeSet
Реализация SortedSet<E>, основанная на красно-черном дереве. Автоматически сортирует элементы.
Особенности:
Уникальность: Да.
Порядок: Нет (игнорирует порядок вставки), но отсортирован по натуральному порядку или Comparator.
Сортировка: Да, всегда отсортирован.
Null: Не разрешен (NullPointerException при сравнении).
Big O: O(log n) для add/remove/contains (дерево балансировано).
Внутренняя работа: Элементы хранятся в узлах дерева, сравниваются через Comparable.compareTo() или Comparator.
Нюансы:
Элементы должны реализовывать Comparable<E> или предоставить Comparator при создании: new TreeSet<>(comparator).
Для custom классов: Реализуйте Comparable или Comparator, иначе ClassCastException.
Итерация: O(n), в отсортированном порядке.
Дополнительные методы: first(), last(), headSet(E to), tailSet(E from) — для подмножеств.
Thread-safety: Нет, используйте Collections.synchronizedSortedSet(new TreeSet<>()).
Память: Больше, чем HashSet, из-за структуры дерева.
Пример кода:
javaimport java.util.TreeSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Integer> numbers = new TreeSet<>();
numbers.add(5);
numbers.add(1);
numbers.add(3);
for (Integer num : numbers) {
System.out.println(num); //отсортировано
}
// С Comparator для обратного порядка
Set<Integer> reverseNumbers = new TreeSet<>((a, b) -> b - a);
reverseNumbers.add(5);
reverseNumbers.add(1);
reverseNumbers.add(3);
System.out.println(reverseNumbers); // [5, 3, 1]
}
}
Вывод: Элементы всегда отсортированы.
Применение множеств: Удаление дубликатов и проверка уникальности
Множества идеальны для задач, где нужна уникальность без дубликатов.
Удаление дубликатов:
Преобразуйте List или массив в Set — дубликаты автоматически удалятся.
Нюанс: Порядок может потеряться (используйте LinkedHashSet для сохранения).
Пример кода:
javaimport java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
List<String> duplicates = new ArrayList<>();
duplicates.add("Яблоко");
duplicates.add("Банан");
duplicates.add("Яблоко");
Set<String> unique = new HashSet<>(duplicates);
System.out.println(unique); // [Банан, Яблоко]
// С сохранением порядка
Set<String> orderedUnique = new LinkedHashSet<>(duplicates);
System.out.println(orderedUnique); // [Яблоко, Банан]
}
}
Вывод: Уникальные элементы, без дубликатов.
Проверка уникальности:
Используйте contains() для быстрой проверки наличия (O(1) в HashSet).
Или add() — если false, элемент уже есть.
Нюанс: Для больших данных Set эффективнее, чем перебор List (O(n)).
Пример кода:
javaimport java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> users = new HashSet<>();
users.add("user1");
if (users.contains("user2")) {
System.out.println("Пользователь существует");
} else {
users.add("user2");
System.out.println("Новый пользователь добавлен");
}
if (!users.add("user1")) {
System.out.println("Дубликат не добавлен"); // add возвращает false
}
}
}
Вывод: Проверка и добавление без дубликатов.
Полезные советы для новичков
HashSet по умолчанию: Для большинства случаев уникальности.
Custom классы: Всегда реализуйте equals() и hashCode() (используйте IDE: Generate → equals() and hashCode()).
Comparator в TreeSet: Для custom сортировки: new TreeSet<>((a, b) -> a.compareTo(b)).
Удаление дубликатов: Удобно для списков из файлов или БД.
Память: TreeSet дороже по памяти, HashSet — оптимален.
Ошибки: ClassCastException в TreeSet без Comparable; ConcurrentModificationException при модификации во время итерации (используйте Iterator.remove()).
#Java #для_новичков #beginner #Collections #HashSet #LinkedHashSet #TreeSet
👍3
Что выведет код?
#Tasks
import java.util.LinkedHashSet;
public class Task091025 {
public static void main(String[] args) {
LinkedHashSet<Integer> set = new LinkedHashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.remove(2);
set.add(2);
System.out.println(set);
}
}
#Tasks
👍1
👍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
Илья Алексеевич Житомирский (12 октября, 1989, Москва, СССР — 12 ноября, 2011, Сан-Франциско, США) — российско-американский разработчик программного обеспечения, сооснователь социальной сети Diaspora.
Оле-Йохан Даль (норв. Ole-Johan Dahl, 12 октября 1931 года, Мандал — 29 июня 2002 года, Осло) — норвежский учёный в области теории вычислительных систем, лауреат премии Тьюринга. Вместе с Кристеном Нюгором является одним из разработчиков основ объектно-ориентированного программирования, а также первого объектно-ориентированного языка программирования Симула.
Брэм Коэн (12 октября 1975 г. Нью-Йорк) — американский программист, автор протокола BitTorrent, оказавшего большое влияние на распределённую передачу файлов и P2P-системы.
1964 — с космодрома Байконур запущен трёхместный космический корабль «Восход-1». Впервые осуществлён полёт многоместного корабля, также впервые полёт осуществлялся без скафандров.
1994 — межпланетная станция НАСА «Магеллан», работавшая с 1989 года, сгорела в атмосфере Венеры
#Biography #Birth_Date #Events #12Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Чего ты тут забыл? 🧐
Мысли вслух, когда устаешь быть мотиватором.
И чего все лезут в IT?
И почему вдруг ты решил, что сможешь?
Если ты вдруг научился устанавливать Windows и твои близкие назвали тебя "Наш программист", это совсем не значит, что ты им стал.
Ты правда думаешь, что тебе тут рады?
Что в IT тебя ждут с открытыми объятиями, чашкой кофе и оффером на 300к?
Нет, дружище. Здесь и без тебя тесно.
Каждый день тысячи таких же "новоиспечённых айтишников" лезут в hh, как в последний вагон уходящего поезда.
Все с одинаковыми мечтами, одинаковыми курсами и одинаковыми "Hello, world" и TODO-шками написанными по гайдам 10-летней давности.
И все уверены, что именно они — будущие синьоры, тимлиды и архитекторы.
А вот нихерашеньки🖕
Реальность №1: ты никому не нужен
Компаний, которым нужны джуны без опыта, но с горящими глазами — меньше, чем вакансий на дирижёра без слуха.
А если вдруг ты туда попал — готовься к тоннам легаси, таскам уровня "почини сервер", и наставнику, который ненавидит тебя и свою жизнь.
Реальность №2: Пока ты учил, всё, что ты выучил — уже устарело
Ты только понял, как работает Spring Boot?
Поздравляю. Он уже обновился, и теперь не работает так, как ты думаешь.
Java? Kotlin поджимает. Kotlin? Уже шепчут про Rust и Go.
А пока ты разбираешься с зависимостями — твой мозг тихо плачет и просит пива.
Не хочешь каждый день учиться? Закинут на антресоль как раритет или выкинут на свалку.
И надо оно тебе?
Реальность №3: денег не будет
Сразу точно не будет. А сможешь ли ты дотерпеть?
Все эти истории про "начал с нуля и через год 250к" — для курсов и буткемпов.
Веришь? Значит ты доверчивый ослик🫏 .
В текущей реальности ты, скорее всего, будешь рад, если найдешь стажировку на 20–30 тысяч без накрутки опыта.
А потом ещё три года будешь доказывать, что не зря ешь офисные печеньки.😄
Реальность №4: ты не выдержишь, если пришёл “просто попробовать”
Если ты думаешь, что сегодня IT, все еще это лёгкий способ заработать — ты точно ошибся.
Говорят лет 5-7 назад брали только за то что ты умел идею запустить.
А сегодня если ты пришёл за “удалёнкой с видом на море” — тебя сожрёт реальность дедлайнов, ревью и Jira. Погребет под собой тонна знаний по кору, sql, спрингу, докеру, многопоточке, коллекциям, ci-cd, кафке, монго, куберу...
И ведь это только начало🥵
Ты еще уверен что оно тебе надо?
Так зачем ты сюда пришёл?
Если хочешь лёгкой работы — уходи. Тебя тут никто не ждет.
Если хочешь “самореализации” — купи мольберт.
Хочешь денег - иди в чиновники и воруй.
Но если ты хочешь понимать, как работает цифровой мир, и готов к боли — оставайся.
Потому что программирование — это не про успех.
Это про любопытство, упрямство и мазохизм в одной IDE☺️ 😉 🤣
Ты такой?
Ты считаешь что сможешь?
И не боишься возможно поломать свой мозг, комп и возможно жизнь об программирование?
Тогда ты тот для кого я веду этот канал.
Остальные, залетные, кто пришел сюда за "откровениями", "посмотреть" и завтра выйдет - не стоят моего труда.
А вот тем кто готов бороться (как и я сам) я посвящаю каждую строчку, каждого поста.
Остальным — удачи. А нам — кофе и терпения.
Я с вами☺️ 😉
Ваш Oleborn🎶
#мои_мысли
⚠️ AHTUNG⚠️
Демотивационная статья. Читать с осторожностью.
Написано открыто, потому что все равно статьи никто не читает😎
Мысли вслух, когда устаешь быть мотиватором.
И чего все лезут в IT?
И почему вдруг ты решил, что сможешь?
Если ты вдруг научился устанавливать Windows и твои близкие назвали тебя "Наш программист", это совсем не значит, что ты им стал.
Ты правда думаешь, что тебе тут рады?
Что в IT тебя ждут с открытыми объятиями, чашкой кофе и оффером на 300к?
Нет, дружище. Здесь и без тебя тесно.
Каждый день тысячи таких же "новоиспечённых айтишников" лезут в hh, как в последний вагон уходящего поезда.
Все с одинаковыми мечтами, одинаковыми курсами и одинаковыми "Hello, world" и TODO-шками написанными по гайдам 10-летней давности.
И все уверены, что именно они — будущие синьоры, тимлиды и архитекторы.
А вот нихерашеньки
Реальность №1: ты никому не нужен
Компаний, которым нужны джуны без опыта, но с горящими глазами — меньше, чем вакансий на дирижёра без слуха.
А если вдруг ты туда попал — готовься к тоннам легаси, таскам уровня "почини сервер", и наставнику, который ненавидит тебя и свою жизнь.
Реальность №2: Пока ты учил, всё, что ты выучил — уже устарело
Ты только понял, как работает Spring Boot?
Поздравляю. Он уже обновился, и теперь не работает так, как ты думаешь.
Java? Kotlin поджимает. Kotlin? Уже шепчут про Rust и Go.
А пока ты разбираешься с зависимостями — твой мозг тихо плачет и просит пива.
Не хочешь каждый день учиться? Закинут на антресоль как раритет или выкинут на свалку.
И надо оно тебе?
Реальность №3: денег не будет
Сразу точно не будет. А сможешь ли ты дотерпеть?
Все эти истории про "начал с нуля и через год 250к" — для курсов и буткемпов.
Веришь? Значит ты доверчивый ослик
В текущей реальности ты, скорее всего, будешь рад, если найдешь стажировку на 20–30 тысяч без накрутки опыта.
А потом ещё три года будешь доказывать, что не зря ешь офисные печеньки.
Реальность №4: ты не выдержишь, если пришёл “просто попробовать”
Если ты думаешь, что сегодня IT, все еще это лёгкий способ заработать — ты точно ошибся.
Говорят лет 5-7 назад брали только за то что ты умел идею запустить.
А сегодня если ты пришёл за “удалёнкой с видом на море” — тебя сожрёт реальность дедлайнов, ревью и Jira. Погребет под собой тонна знаний по кору, sql, спрингу, докеру, многопоточке, коллекциям, ci-cd, кафке, монго, куберу...
И ведь это только начало
Ты еще уверен что оно тебе надо?
Так зачем ты сюда пришёл?
Если хочешь лёгкой работы — уходи. Тебя тут никто не ждет.
Если хочешь “самореализации” — купи мольберт.
Хочешь денег - иди в чиновники и воруй.
Но если ты хочешь понимать, как работает цифровой мир, и готов к боли — оставайся.
Потому что программирование — это не про успех.
Это про любопытство, упрямство и мазохизм в одной IDE
Ты такой?
Ты считаешь что сможешь?
И не боишься возможно поломать свой мозг, комп и возможно жизнь об программирование?
Тогда ты тот для кого я веду этот канал.
Остальные, залетные, кто пришел сюда за "откровениями", "посмотреть" и завтра выйдет - не стоят моего труда.
А вот тем кто готов бороться (как и я сам) я посвящаю каждую строчку, каждого поста.
Остальным — удачи. А нам — кофе и терпения.
Я с вами
Ваш Oleborn
#мои_мысли
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4 1