Java for Beginner
742 subscribers
714 photos
201 videos
12 files
1.16K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
А сколько вы жмете от груди?

Хотите парадокс? 😨

Чем больше у Вас свободного времени, тем больше интересных занятий которые пожирают все свободное время, которое вы хотели потратить на "полезные" дела.


И сегодня (как понятно наверно из заголовка) я хочу поговорить с Вами о спорте и поддержании нашего мешка с костями в надлежащем состоянии.

Раньше, когда у меня практически не было свободного времени, я мечтал, что как только оно появится - я начну постоянно заниматься (возможно даже в спортзале) и поддерживать себя в форме. 💪

Теперь когда я работаю на удаленке, заставить себя заниматься оказалось неожиданно сложной задачей.

Ведь хоть работа и удаленная - она все равно есть. А так же всегда есть очередное видео, по новой, неизученной технологии, которое уже долго ждет своего часа.

И по-любому надо делать выбор.



Что мы получаем от сидячей работы.

Тут наверно стоит предупредить молодых людей - вы не бессмертны.

Увы и ах
🤷‍♀️

Поэтому, чем раньше вы задумаетесь о том в каком состоянии будет ваш организм к 40-50 годам, тем лучше (любители энергетиков привет!).

Но и тем кто сейчас вкатывается в IT стоит знать - если вы меняете активный, физический труд, на сидячий образ жизни - изменения в организме не заставят себя ждать (дружно машем геморрою и варикозу, ожирению и остаткам зрения
😂).

И многие с пренебрежением относятся к этом, мол, "я вон худой как палка, какое ожирение, какой геморрой?"
В целом они правы, но уж точно поверьте - болячка от застоя организма найдется для каждого, если об этом не заботиться.



Что делать?

Двигаться.
Одно слово реально поможет вам не задумываться о негативных последствиях 12-часового, сидячего рабочего дня.

Как двигаться и куда - это зависит от индивидуального состояния организма.

Кто-то может 90 минут гонять по полю мяч, без особого напряжения, а кому-то 3-х километровая прогулка по парку кажется вызовом.

Поэтому по настоящему выбирать Вам.

Нужно помнить только одно - двигаться необходимо.


Цифры конечно отличаются, сколько в среднем, в зависимости от возраста и так далее. Я не собираюсь тут рассказывать КАК и СКОЛЬКО. Я просто хочу по дружески предупредить, а в остальном Вам поможет интернет, тренер или не дай бог, доктор.


Как себя заставить?

Тут вам пригодятся мои советы из предыдущих воскресных мотивационных статей по изучению Java.

Ведь это очень похоже.

Вы заставляете себя выйти из зоны комфорта, заставляете свое тело и мозг работать, чего они не хотят.

Самое главное - сделать первый шаг.


И в целом, эта статья - не попытка напугать. Я знаю множество людей которые столкнулись с проблемами при сидячем образе жизни. Добавить к этому вкусную и жирную пищу, алкоголь и сигареты - и вот кандидат к получению хронических заболеваний.

Ну и надеюсь, вы понимаете - ни одному бизнесу не нужен хронически больной работник, который регулярно ходит на больничные, не выполняет свою работу в полном объеме из-за регулярно плохого состояния и так далее.
И это относится не только к IT.


Поэтому - а сколько вы жмете от груди? 💪


Берегите себя. На этом извольте откланяться - ваш @Oleborn


😎 Пишите вашем мнение в комментарии.


#мои_мысли
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🗓 История IT-технологий сегодня — 06 октября


ℹ️ Кто родился в этот день

Серге́й Льво́вич Со́болев (23 сентября [6 октября] 1908, Санкт-Петербург — 3 января 1989, Москва) — советский математик, занимавшийся математическим анализом и дифференциальными уравнениями в частных производных. Академик АН СССР (1939). Герой Социалистического Труда (1951). Лауреат трёх Сталинских премий и Государственной премии СССР.


🌐 Знаковые события

1995 — Открыта 51 Пегаса b — первая экзопланета у звезды главной последовательности.

2000 — согласно сообщению британской компании «NetNames», зарегистрировано 30-миллионное доменное имя.

2010
— начало работу приложение по обмену фотографиями Instagram.


#Biography #Birth_Date #Events #06Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Реактивное программирование

Базовые операторы в Reactor: map, filter, flatMap


Операторы — это методы на Mono/Flux, которые позволяют строить конвейеры: преобразовывать, фильтровать и комбинировать данные асинхронно. Представьте их как звенья в цепи: каждый берёт входной поток, меняет его и передаёт дальше. Сегодня разберём три фундаментальных: map (преобразование элементов), filter (фильтрация) и flatMap (плоское преобразование, для слияния подпотоков). Эти операторы — основа для сложных сценариев, они решают проблемы из первого поста, позволяя писать декларативный код вместо ручных циклов и ожиданий.


Операторы в Reactor — декларативные: вы описываете, что делать с данными, а библиотека заботится об асинхронности, backpressure и ошибках. Они не меняют исходный поток (иммутабельны), а создают новый. Это делает код читаемым и тестируемым.



Map: простое преобразование элементов

Map — оператор для изменения каждого элемента потока. Он берёт входной элемент, применяет функцию и выдаёт результат. Синхронный: функция должна быть быстрой и без блокировок. Идеален для конвертации типов, вычислений или форматирования.

Пример на Flux:
import reactor.core.publisher.Flux;
Flux<String> originalFlux = Flux.just("яблоко", "банан", "вишня");
Flux<String> transformed = originalFlux.map(fruit -> fruit.toUpperCase()); // Преобразование в верхний регистр
transformed.subscribe(System.out::println); // Вывод: "ЯБЛОКО", "БАНАН", "ВИШНЯ"

Здесь map применяет лямбду к каждому элементу последовательно. Если ошибка в функции — сработает onError.


На Mono:
Mono<Integer> num = Mono.just(5).map(x -> x * 2); // Результат: 10


Почему map полезен? В традиционных подходах (как в CompletableFuture.thenApply) вы строите цепочки, но рискуете вложенностью. В Reactor map делает конвейер линейным: читается как последовательный код, но работает асинхронно. Поддерживает backpressure: если подписчик запрашивает n, map передаёт запрос upstream (источнику).


Filter: отбор элементов по условию

Filter — для пропуска только нужных элементов. Принимает предикат (функцию, возвращающую true/false) и пропускает те, для которых true. Остальные игнорируются — поток "сужается".

Пример на Flux:
Flux<Integer> numbers = Flux.range(1, 10);
Flux<Integer> evenNumbers = numbers.filter(num -> num % 2 == 0); // Только чётные
evenNumbers.subscribe(System.out::println); // Вывод: 2, 4, 6, 8, 10

Если поток пустой или ничего не проходит — onComplete сработает без onNext.


На Mono:
Mono<String> word = Mono.just("привет").filter(w -> w.length() > 7); // Не пройдёт — пустой Mono


Filter экономит ресурсы: ненужные элементы не обрабатываются дальше в цепи. В отличие от императивных циклов (где вы фильтруете в for с if), здесь всё асинхронно и с backpressure — запросы передаются источнику только для прошедших элементов.

Комбинация с map: numbers.filter(num -> num > 5).map(num -> num * 10).subscribe(); // 60, 70, 80, 90, 100
Это строит конвейер: фильтр → преобразование, без ручных переменных.



#Java #middle #Reactor #map #filter #flatMap
👍1
FlatMap: плоское преобразование для асинхронных подпотоков

FlatMap — мощный оператор для случаев, когда из одного элемента нужно создать подпоток (Publisher), и слить их в плоский результат. Это как map, но для асинхронных или множественных выходов: он "разворачивает" вложенные потоки. Полезен для запросов в цикле: например, для каждого пользователя — асинхронно запросить данные.


Пример на Flux:
Flux<String> fruits = Flux.just("яблоко", "банан");
Flux<Character> letters = fruits.flatMap(fruit -> Flux.fromArray(fruit.toCharArray())); // Из строки — поток символов
letters.subscribe(System.out::println); // Вывод: я, б, л, о, к, о, б, а, н, а, н (в возможном перемешанном порядке, если асинхронно)

Здесь flatMap берёт строку, создаёт Flux из символов и сливает всё в один поток. В отличие от map (который вернул бы Flux<Flux<Character>> — вложенный), flatMap "сплющивает".



Асинхронный пример: симулируем API-запросы.

import java.time.Duration;
Flux<String> users = Flux.just("user1", "user2");
Flux<String> data = users.flatMap(user -> Mono.just("Данные для " + user).delayElement(Duration.ofSeconds(1))); // Асинхронный подпоток с задержкой
data.subscribe(System.out::println); // Вывод через секунды: "Данные для user1", "Данные для user2" (параллельно, если scheduler позволяет)

FlatMap уважает backpressure: запрашивает у подпотоков по мере нужды. Но осторожно: если подпотоки бесконечные — рискуете перегрузкой. Параметр concurrency (flatMap(func, concurrency)) ограничивает параллелизм.


Почему flatMap решает проблемы? В традиционных подходах (циклы с Future) вы ждёте каждый запрос, блокируя. Здесь — асинхронное слияние, без ожиданий и callback-ада: цепочка читаема.



Практические советы и подводные камни

Читаемость: цепочки операторов пишите по строкам для ясности: flux.filter(...).map(...).flatMap(...);
Ошибки: если в map/flatMap исключение — onError. Используйте handle() для условной обработки.
Производительность: в flatMap устанавливайте concurrency (default 256) для контроля параллелизма: flatMap(func, 4) — max 4 подпотока одновременно.
Камень: блокирующий код в лямбдах — сломает асинхронность. Для IO — используйте flatMap с Mono.fromCallable и publishOn(Schedulers.boundedElastic()).
Тестирование: StepVerifier.create(
flux.map(...)).expectNext("ЯБЛОКО").verifyComplete();


#Java #middle #Reactor #map #filter #flatMap
👍2
Что выведет код?

import java.util.*;

public class Task061025 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));

for (Integer num : list) {
if (num == 3) {
list.remove(num);
}
}

System.out.println(list);
}
}


#Tasks
👍1
Вопрос с собеседований

Что произойдет, если в finally есть return? 🤓

Ответ:

Если в finally прописан return
, то он переопределит любые значения, возвращаемые в try или catch.

Это считается плохой практикой, так как затрудняет понимание кода и может скрывать исключения, которые должны были выброситься.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🗓 История IT-технологий сегодня — 07 октября


ℹ️ Кто родился в этот день

Джон Эдвард Хопкрофт (родился 7 октября 1939 года) — американский теоретик компьютерных наук, лауреат премии Тьюринга 1986 за фундаментальные достижения в алгоритмах и структурах данных.

Ви́ктор Леони́дович Матро́сов (7 октября 1950, Москва — 19 января 2015, Московская область) — советский / российский математик; профессор, доктор физико-математических наук.


🌐 Знаковые события

1959 — космический аппарат «Луна-3» впервые совершил облёт Луны. Аппарат сделал первые фотоснимки её обратной стороны и передал изображения на Землю.


#Biography #Birth_Date #Events #07Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Коллекции в Java

Глава 3. Set — множества

Интерфейс Set. Особенности множеств


Интерфейс Set<E> — это часть Java Collections Framework (JCF), который представляет коллекцию уникальных элементов без дубликатов. Set является подинтерфейсом Collection, но с ключевым отличием: он не позволяет хранить одинаковые элементы. Если вы пытаетесь добавить дубликат, операция игнорируется.

Основные характеристики Set:
Уникальность элементов: Да, дубликаты не хранятся.
Упорядоченность: В общем случае нет (зависит от реализации).
Сортировка: Нет по умолчанию, но возможна в подтипах.
Время доступа (Big O): Для основных операций (add, remove, contains) — O(1) в HashSet, O(log n) в TreeSet.


Set моделирует математическое множество: элементы уникальны, нет индексации, фокус на наличии/отсутствии.

Методы Set (наследуются от Collection, но с нюансами):
boolean add(E e): Добавляет элемент, если его нет (возвращает true, если добавлен).
boolean remove(Object o): Удаляет элемент, если он есть.
boolean contains(Object o): Проверяет наличие.
int size(): Размер.
boolean isEmpty(): Пустота.
Iterator<E> iterator(): Для перебора (нет порядка по умолчанию).
void clear(): Очистка.

Нюанс: Set не имеет get(int index) — нет индексации, как в List. Перебор через Iterator или for-each.


Особенности множеств в Java

Множества в Java имеют несколько важных особенностей, которые определяют их использование:

Уникальность элементов:
Set автоматически предотвращает дубликаты на основе методов equals() и hashCode() (для HashSet) или compareTo() (для TreeSet).
Если добавить существующий элемент, add() возвращает false, коллекция не меняется.
Нюанс: Для custom классов обязательно переопределите equals() и hashCode() (используйте Objects.equals() и Objects.hash()). Без этого уникальность по ссылке, не по значению.


Отсутствие гарантированного порядка:
В HashSet порядок непредсказуем (зависит от хэша).
В LinkedHashSet — порядок вставки.
В TreeSet — сортированный порядок.
Нюанс: Не полагайтесь на порядок в HashSet — он может измениться при ресайзе.


Null элементы:
HashSet и LinkedHashSet позволяют один null.
TreeSet — нет (NullPointerException, так как сравнивает).
Нюанс: Null в Set — редко рекомендуется, но возможно.


Итерация и модификация:
Перебор через for-each или Iterator.
Нюанс: Во время итерации нельзя модифицировать Set (ConcurrentModificationException). Используйте Iterator.remove() для удаления.


Производительность:

HashSet: O(1) для add/remove/contains (средний случай).
TreeSet: O(log n), но с автосортировкой.
Нюанс: HashSet требует хорошего hashCode() — плохой приводит к O(n) worst-case.


Синхронизация:
Стандартные реализации не thread-safe. Для многопоточности: Collections.synchronizedSet(Set set) или ConcurrentHashSet (из Guava).


#Java #для_новичков #beginner #Collections #Set
👍4
Примеры использования Set

HashSet: Для быстрых операций без порядка.
import 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.size()); // 2
System.out.println(fruits.contains("Банан")); // true

for (String fruit : fruits) {
System.out.println(fruit); // Порядок непредсказуем
}
}
}


Вывод: Размер 2, содержит "Банан", элементы в случайном порядке.


LinkedHashSet: С сохранением порядка вставки.
import 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); // Яблоко, Банан, Апельсин — порядок вставки
}
}
}



TreeSet: С автосортировкой.

import 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); // 1, 3, 5 — отсортировано
}
}
}


Нюанс: Для custom классов в TreeSet реализуйте Comparable или используйте Comparator при создании.


Как создать и использовать Set в IntelliJ IDEA

Импорт: В коде напишите Set — IDE предложит import java.util.Set; и реализацию (HashSet и т.д.).
Generics: Используйте Set для типобезопасности.
Автодополнение: При add() IDE подскажет параметры.
Отладка: В debug смотрите содержимое Set — IDE покажет элементы.
Конвертация: Из List в Set: new HashSet<>(list) — для удаления дубликатов.



Полезные советы для новичков

Выбор реализации: HashSet для скорости, LinkedHashSet для порядка, TreeSet для сортировки.
equals() и hashCode(): Всегда переопределяйте в custom классах для Set/Map (используйте
@Override и Objects.hash()).
Удаление дубликатов: Set — быстрый способ: new HashSet<>(list).
Null: Избегайте в TreeSet; в HashSet — осторожно.
Итерация: For-each безопасен для чтения, но не модифицируйте во время перебора.


#Java #для_новичков #beginner #Collections #Set
👍2
Что выведет код?

import java.util.*;

public class Task071025 {
public static void main(String[] args) {
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 2, 1));

System.out.println(set1.hashCode() == set2.hashCode());
System.out.println(set1.toString().equals(set2.toString()));
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
27%
true true
27%
true false
27%
false true
20%
false false
Вопрос с собеседований

Можно ли поймать Error?🤓

Ответ:

Технически Error можно поймать через catch, но этого не делают.

Errors сигнализируют о критических проблемах JVM (например, OutOfMemoryError, StackOverflowError), которые исправить на уровне приложения невозможно.

Их обработка только маскирует проблему.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🗓 История IT-технологий сегодня — 08 октября


ℹ️ Кто родился в этот день

Хендрик Якоб (Яап) ван ден Херик (родился 8 октября 1947 года в Роттердаме) — нидерландский компьютерный учёный, профессор Университета Лейдена; известен работами по компьютерным шахматам и искусственному интеллекту.

Роберт Бертран Франс (8 октября 1960 г. – 15 февраля 2015 г.) — родом из Ямайки, американский учёный в области формальных методов, Unified Modeling Language (UML) и модельно-ориентированного развития ПО.


🌐 Знаковые события

1978 — ядерный взрыв «Вятка» (15 килотонн).


#Biography #Birth_Date #Events #08Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2