Java for Beginner
870 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Сложность отладки — аспект, больно знакомый при работе со Stream API. Когда исключение происходит внутри лямбды, стектрейс уходит в глубины java.util.stream:
java.lang.NullPointerException
at com.example.Service.lambda$process$0(Service.java:25)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.example.Service.process(Service.java:26)


Между вашим кодом (строка 25) и точкой вызова (строка 26) — шесть фреймов внутренней механики Stream API. В отладчике сложно отследить, над каким именно элементом потока выполняется операция, потому что состояние скрыто внутри Sink — объектов, реализующих интерфейс потребителей данных в конвейере.

Стратегии борьбы: использование peek() для вставки логирования (хотя это изменяет семантику конвейера), извлечение лямбд в именованные методы (улучшает стектрейс), использование IntelliJ IDEA Stream Debugger — визуального инструмента, показывающего прохождение элементов через стадии конвейера.

Потеря явного контроля — фундаментальная компромисс. Когда мы делегируем управление состоянием Stream API, мы теряем возможность микрооптимизации. Мы не можем прервать обработку в произвольной точке, кроме как через операции findFirst, findAny, anyMatch — и они прерывают весь конвейер, а не отдельную операцию. Мы не можем переиспользовать промежуточную коллекцию, потому что она никогда не материализуется. Мы не можем легко обработать исключение для одного элемента и продолжить — весь конвейер обрушится, если лямбда бросит unchecked exception.

Сравним с императивным кодом для сложной обработки с частичным восстановлением:
// Императивно: можем обработать ошибку элемента и продолжить
List<Result> results = new ArrayList<>();
for (Record record : records) {
try {
Result r = process(record);
if (r.isValid()) {
results.add(r);
}
} catch (ProcessingException e) {
log.warn("Пропускаем запись {}: {}", record.getId(), e.getMessage());
// Продолжаем цикл
}
}


В Stream API такая логика требует оборачивания операции в try-catch внутри лямбды, что нарушает чистоту функционального стиля, или использования map с результирующим типом, содержащим Either успех или ошибку — что усложняет конвейер.

Отсутствие доступа к индексу — ещё одно ограничение. Поток — это абстракция последовательности без адресации. Если логика требует знания позиции элемента (например, "обработать каждый второй элемент"), приходится использовать IntStream.range() как мост к индексам или явно поддерживать счётчик вне потока — что возвращает нас к управлению состоянием.

#Java #для_новичков #beginner #stream_api #declarative
👍4🔥1
Что выведет код?

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Task060226 {
public static void main(String[] args) {
String result = Stream.of("a", "b", "c", "d")
.collect(Collectors.collectingAndThen(
Collectors.joining("+"),
String::toUpperCase
));

System.out.println(result);
}
}


#Tasks
🔥5
Варианты ответа:
Anonymous Quiz
85%
A+B+C+D
7%
a+b+c+d
7%
ABCD
0%
abcd
🔥3👍1
Какие области памяти (memory areas) вы знаете в JVM? 🤓

Ответ:

Память JVM делится на несколько областей:
Heap (Куча) — общее хранилище для всех объектов и массивов (делится на Young и Old Generation).
Stack (Стек) — хранит локальные переменные и вызовы методов для каждого потока.
Metaspace (ранее PermGen) — хранит метаданные классов, загруженных ClassLoader.
Native Method Stack — для нативных методов.
PC Register — хранит адрес текущей исполняемой инструкции для каждого потока.

Heap и Metaspace являются общими для всех потоков.


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

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

Ван Ань (кит. упр. 王安, пиньинь Wáng Ān, англ. An Wang, встречается транскрипция Эн Ванг; 7 февраля 1920 года — 24 марта 1990 года) — инженер по вычислительной технике и изобретатель, основатель компьютерной компании Wang Laboratories. Американец китайского происхождения.


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

1984 — астронавт НАСА Брюс Маккэндлесс (специалист полёта шаттла Челленджер STS-41B) стал первым человеком, работавшим в открытом космическом пространстве без какой-либо связи с кораблём, в свободном полёте.


#Biography #Birth_Date #Events #07февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
С 31.01 по 06.02
Предыдущий пост(с 24.01 по 30.01)

Воскресный мотивационный пост:
Не было мотивации

Запись встреч/видео:
4. Spring Boot Actuator: телеметрия вашего микросервиса

Обучающие статьи:
Java:
Раздел 7. Алгоритмы

Глава 5: Рекурсия, деревья и введение в динамическое программирование
Практическое применение рекурсии в библиотечной системе

Раздел 8. Stream API и функциональный стиль

Глава 1: Философский фундамент. От шагов к преобразованиям
Императивный код — машина Тьюринга в миниатюре
Декларативный стиль — чертёж результата

Советы по Java:
[Совет по Java #001] Всегда переопределяйте equals() и hashCode() вместе, особенно для сущностей, которые будут храниться в HashSet или использоваться как ключи в HashMap.
[Совет по Java #002] Используйте StringBuilder для конкатенации строк в циклах. String в цикле создает множество объектов и убивает производительность.

Полезные статьи и видео:
Моя статья: State-first архитектура: поиск другого способа управления бизнес-логикой

Подробный гайд для айтишников: как понять, что вы пришли к врачу–мракобесу?
Мы построили мир, который больше не понимаем или почему NASA не может скопировать свой же двигатель


Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍3🔥2
Media is too big
VIEW IN TELEGRAM
Смешно же)
🤣3🤓3🔥1🤯1😱1
История IT-технологий сегодня — 08 Февраля

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

Никола́й Я́ковлевич Матю́хин (1927—1984) — учёный, крупный специалист в области вычислительный техники, конструктор многих ЭВМ. Принимал участие в разработке ЭВМ М-1 и её последующих поколений. Лауреат Государственной премии СССР.

Матюхин одним из первых высказал идею об автоматических средствах проектирования и моделирования. В своих работах он описал принципы работы, на которых основаны и многие современные САПР.
На базе ЕС ЭВМ Матюхин впервые создал многомашинные системы (кластеры), разработал архитектурные принципы построения подобных машин под системы реального времени.



Че́стер Ка́рлсон (англ. Chester Carlson; 8 февраля 1906; Сиэтл — 19 сентября 1968; Нью-Йорк)американский физик по образованию, адвокат по профессии и изобретатель по призванию. Именно Карлсону принадлежит право на изобретение принципа электрографии или ксерографии, одного из основных изобретений XX века.

Первый оттиск Карлсон и Корнеи получили в своей домашней лаборатории в Нью-Йорке 22 октября 1938 года. Патент на эту технологию был получен 6 октября 1942 года. Долгое время Карлсон безуспешно пытался внедрить своё изобретение, доказывая, что оно абсолютно необходимо для бизнеса, но ему по очереди отказали в 20 компаниях, ссылаясь на то, что его изобретение слишком громоздко и сильно пачкает листы, к тому же человек может значительно лучше справиться с задачей копирования. Удача улыбнулась изобретателю в 1944 году в Battelle Institute, расположенном в штате Огайо. Там ему предложили усовершенствовать технологию и даже нашли точное слово для названия данного процесса — «электрофотография». После чего лицензию на дальнейшую разработку и производство копировальных аппаратов приобрела фирма Haloid Company. Именно тогда было решено, что слово «электрофотография» слишком научное и может отпугнуть потенциального покупателя. Помощь в поиске более удачного названия оказал местный профессор-филолог. Он придумал термин «ксерография» от др.-греч. слов др.-греч. ξερός «сухой» и γράφω «пишу», а потом уже сам изобретатель Карлсон додумался сократить слово до простого «ксерокс». В итоге в 1948 году первые ксероксы появились на рынке под названием Model A. После выпуска в 1959 году первой полностью автоматической модели Xerox 914 компания Haloid сменила название на Xerox Corporation.


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

1879 — на заседании Канадского королевского института сэр Сэндфорд Флеминг впервые предложил идею о введении всемирного времени.


#Biography #Birth_Date #Events #08февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Честное мнение о курсе Евгения Борисова 😂
👍1🤯1🤣11
This media is not supported in your browser
VIEW IN TELEGRAM
Она же ошиблась, да?
🤣6🔥1🆒1
Я не забыл про видео, но так как вечером опять печальный интернет, загружу завтра с утра пораньше))

🧑‍💻 Всем хорошего вечера))
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥21
5. Бизнес-метрики в Spring Boot: Micrometer и реальная Observability

Стоп! Ваш Spring Boot приложение врет вам.

Actuator показывает, что CPU на 20%, память в норме, запросы обрабатываются. Но бизнес простаивает. Заказы не создаются, пользователи уходят, а вы узнаете об этом последним.

В этом видео мы устраним этот разрыв. Я объясню как заставить ваше приложение говорить не о процессах Java, а о бизнесе.

Что вы узнаете:

🔹 Проблема технических метрик: Почему actuator/health — это ложь, когда речь идет о бизнесе
🔹 Практика: Добавим в OrderHub метрики, которые действительно важны:
orders.created.total — сколько заказов создано
orders.created.duration — сколько времени занимает создание
orders.retrieved.total — сколько заказов запрошено
orders.retrieved.duration — сколько времени занимает запрос
Разделение на успехи и ошибки через теги

🔹 AOP-магия: Создадим аннотацию
@BusinessMetric, которая автоматически собирает метрики без изменения бизнес-кода
🔹 Production-мышление: Как правильно именовать метрики, контролировать cardinality тегов и готовить данные для Prometheus

Исходный код проекта на GitHub очень ждет Ваших звезд ☺️

Ссылка на Youtube
Ссылка на Рутьюб

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3🆒1
Всегда было любопытно, зачем таким девушкам мой канал про Java 😨

Вот честно? Неужто они Java ИЗУЧАЮТ? 🆘

P.S. Девушка покинула канал 😭
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3🔥2🤓1
История IT-технологий сегодня — 09 Февраля

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

Буркхард Хайм (нем. Burkhard Heim, 9 февраля 1925—14 января 2001) — немецкий физик-теоретик. В 1950-х годах разработал собственную квантовую теорию — теория Хайма (обнародована в 1957) — на основе теории относительности Альберта Эйнштейна.[1]

Предполагается, что на основе его теории (или теорий, разработанных в дальнейшем), человечество сможет строить корабли, способные достичь планет Солнечной системы за несколько часов. Предполагается, что с помощью так называемого «прыжка в гиперпространство» можно будет долететь к звезде, лежащей в десятке световых лет от Земли, за 80 дней по земному и корабельному времени.[2]

Буркхард Хайм не знал английского и не публиковал свои выкладки на нём; по этой причине его теория до сих пор не слишком известна среди физиков.



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

1959 – Первая межконтинентальная баллистическая ракета Р-7 «Семёрка» принята на вооружение в Плесецке , СССР .


#Biography #Birth_Date #Events #09февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
[Совет по Java #003]

Тема: Никогда не используйте float и double для точных расчетов с деньгами. Используйте BigDecimal или целые числа (копейки, центы).

Проблема: Типы с плавающей запятой (float и double) реализуют двоичную арифметику IEEE 754 и не могут точно представлять большинство десятичных дробей. Это приводит к ошибкам округления и потере точности уже при простейших арифметических операциях.

Данная особенность является фундаментальной, а не багом языка. Например, результат вычисления 0.1 + 0.2 в типе double не будет равен 0.3, а составит 0.30000000000000004. В финансовых, бухгалтерских и любых других расчетах, где важна точность до минимальной единицы (копейки, цента), такие ошибки неприемлемы. Они накапливаются при множественных операциях, приводя к существенным расхождениям в итоговых суммах, что является критическим дефектом.

Решение: Для точных десятичных вычислений необходимо использовать тип java.math.BigDecimal, который предназначен для представения произвольной точности знаков после запятой и предоставляет полный контроль над округлением. Альтернативный, высокопроизводительный подход — выполнять все расчеты в целочисленных типах (long, int), оперируя минимальными единицами валюты (например, копейками, а не рублями).

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


import java.math.BigDecimal;
import java.math.RoundingMode;

public class MonetaryCalculation {
public static void main(String[] args) {
//Антипаттерн: Ошибка округления.
double dollars = 1.00;
double centsToAdd = 0.10;
for (int i = 0; i < 10; i++) {
dollars += centsToAdd; // Приблизительное вычисление
}
System.out.println("Double result: " + dollars); // Выведет ~2.0999999999999996

//Решение 1: Использование BigDecimal (с конструктором из String!).
BigDecimal bigDollars = new BigDecimal("1.00");
BigDecimal bigCents = new BigDecimal("0.10");
for (int i = 0; i < 10; i++) {
bigDollars = bigDollars.add(bigCents); // Точное вычисление
}
System.out.println("BigDecimal result: " + bigDollars); // Точно 2.00

// Важно: Задание масштаба и режима округления для операций.
BigDecimal a = new BigDecimal("10.00");
BigDecimal b = new BigDecimal("3.00");
BigDecimal division = a.divide(b, 2, RoundingMode.HALF_UP); // 3.33
System.out.println("Division with rounding: " + division);

//Решение 2: Использование целых чисел (в копейках).
long balanceInKopecks = 100L; // 1 рубль = 100 копеек
long kopecksToAdd = 10L; // 10 копеек
for (int i = 0; i < 10; i++) {
balanceInKopecks += kopecksToAdd;
}
double resultInRubles = balanceInKopecks / 100.0; // Преобразование для вывода
System.out.println("Long (kopecks) result: " + resultInRubles); // Точно 2.0
}
}


Объяснение: Ключевой нюанс при работе с BigDecimal — использование конструктора, принимающего String. Конструктор BigDecimal(double) также подвержен ошибкам представления, так как передаваемое ему значение double уже содержит погрешность. BigDecimal является неизменяемым (immutable), каждая операция возвращает новый объект.

Он требует явного указания MathContext или RoundingMode для операций, которые могут привести к бесконечной десятичной дроби (например, деление), что делает вычисления полностью контролируемыми. Целочисленный подход (long) лишен накладных расходов на создание объектов и сложную арифметику, поэтому он предпочтителен в высоконагруженных системах, но требует аккуратного ручного управления переполнением и преобразованием для отображения.


#Java #советы
👍9🔥1
Что выведет код?

public class Task090226 {
public static void main(String[] args) {
double price = 0.10;
double total = 0.00;
int items = 0;

for (int i = 0; i < 10; i++) {
total += price;
}

System.out.println(total == 1.00);
System.out.println(total);
}
}


#Tasks
👍2
👍2🤯1
Что такое класс-загрузчик (ClassLoader) 🤓

Ответ:

ClassLoader
— это часть JVM, отвечающая за динамическую загрузку классов в память во время выполнения.

Загрузка происходит иерархически и по принципу делегирования.

Существует три основных встроенных загрузчика:
- Bootstrap ClassLoader (загружает классы Java, написан на C++),
- Extension ClassLoader (загружает классы из jre/lib/ext),
- Application/System ClassLoader (загружает классы из classpath приложения).

Разработчики могут создавать свои загрузчики, наследуясь от ClassLoader, что используется, например, в сервлет-контейнерах (Tomcat) или для реализации горячего перезапуска кода.


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

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

Уолтер Хаузер Браттейн (англ. Walter Houser Brattain; 10 февраля 1902 — 13 октября 1987) — американский физик, лауреат Нобелевской премии по физике в 1956 году «за исследования полупроводников и открытие транзисторного эффекта» (совместно с Уильямом Брэдфордом Шокли и Джоном Бардином).


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

1996 — начался первый шахматный матч между суперкомпьютером IBM Deep Blue и Гарри Каспаровым (со счётом 4—2 победил Г. Каспаров).

2009 — на орбите Земли произошло первое столкновение искусственных спутников за всю историю космонавтики. Столкновение произошло над территорией Российской Федерации (над полуостровом Таймыр, над точкой 72,5° с. ш., 97,9° в. д.), на высоте 788,6 километра. Два спутника во время вращения вокруг Земли со скоростью около 7,5 км/с столкнулись на относительной скорости свыше 10 км/с. Искусственные спутники — «Космос-2251», принадлежавший Космическим войскам России, выведенный на орбиту в 1993 году и функционировавший до 1995 года, и Iridium 33, один из 72 спутников международного оператора спутниковой телефонной связи «Иридиум», запущенный на орбиту в 1997 году, в результате столкновения разрушились полностью. Масса американского спутника «Иридиум» составляла 600 кг, а российского аппарата «Космос-2251» — 900 кг. В результате столкновения образовалось около 600 обломков.


#Biography #Birth_Date #Events #10февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 8. Stream API и функциональный стиль в Java

Глава 1: Философский фундамент. От шагов к преобразованиям

Практика: Рефакторинг мышления в «Библиотеке»

Задача: Найти книги автора «X», отсортировать по году издания, вернуть названия 3 самых старых.

Stream API и функциональный стиль в Java, это один из самых мощных инструментов современного Java, который позволяет писать код более выразительно, лаконично и эффективно. Но прежде чем погружаться в синтаксис Stream, важно понять философский фундамент: переход от императивного стиля (шаг за шагом, с управлением состоянием) к декларативному (описание, что нужно, без деталей как).

Сегодня мы проведем рефакторинг мышления на примере проекта «Библиотека»: решим задачу поиска книг автора "X", сортировки по году и возврата названий 3 самых старых. Мы сделаем это в два шага — императивно и декларативно (мысленно), чтобы вы почувствовали разницу.


Подготовка к уроку

Перед началом убедитесь, что ваш проект «Библиотека» готов: класс Book с полями title, author, year и геттерами, класс Library с List<Book> books и методами добавления/вывода. Добавьте 10–15 книг с разными авторами, включая автора "X" с минимум 5 книгами разных годов.

Импортируйте пакеты: В Library.java импортируйте java.util.Comparator, java.util.ArrayList.

Задача — фильтрация, сортировка, отображение и ограничение. Императивно — шаг за шагом с временными коллекциями. Декларативно — описание цепочки преобразований.


Шаг 1: Императивный подход

В императивном стиле вы описываете "как" сделать: создаёте временные структуры, управляете циклами, изменяете состояние.

Создайте метод findOldestBooksByAuthorImperative(String author, int limit) в Library:
Возвращает List<String> — названия limit самых старых книг автора.
Создайте временный List<Book> filteredBooks = new ArrayList<>();.
Переберите books: for (Book b : books) if (b.getAuthor().equals(author)) filteredBooks.add(b);.
Отсортируйте filteredBooks по году: filteredBooks.sort(Comparator.comparingInt(Book::getYear)); (по возрастанию — самые старые сначала).
Создайте результат List<String> titles = new ArrayList<>();.
Переберите filteredBooks: for (int i = 0; i < Math.min(limit, filteredBooks.size()); i++) titles.add(filteredBooks.get(i).getTitle());.
Верните titles.

Тестирование:
Вызовите с author = "X", limit = 3 — получите 3 самых старых названия.
Проверьте на пустом списке или без книг автора — вернёт пустой list.

Анализ императивного подхода (объёмно):
2 временных коллекции: filteredBooks (для фильтра) и titles (для отображения) — overhead памяти O(n).
3 точки изменения состояния: add в filtered, sort (мутирует list), add в titles — каждая может вызвать ошибки (null, index out of bounds).
Явное управление индексами: Math.min и i < limit — ручной контроль, error-prone (off-by-one).

Процессы внутри:
Фильтр: O(n) перебор, add O(1).
Sort: Timsort O(n log n), мутирует.
Отображение: O(limit) цикл.

Ловушки: Если books изменяется во время перебора — ConcurrentModificationException; sort по году ascending — для "старых" (маленький год) правильно.
Преимущества: Ясно "как" работает, контроль.
Недостатки: Verbose, mutable state, трудно parallelize.


#Java #для_новичков #beginner #Практика #stream_api #declarative
👍4
Шаг 2: Декларативный подход (мысленно)

В декларативном стиле вы описываете "что" нужно: цепочку преобразований данных, без деталей реализации. Это фундамент Stream API — думайте о данных как о потоке, который фильтруется, сортируется, отображается.

Мысленно опишите цепочку в комментариях метода findOldestBooksByAuthorDeclarative(String author, int limit):
Фильтр: Выбрать книги, где author == "X".
Сортировка: Упорядочить по году издания (ascending для старых).
Отображение: Преобразовать в названия (title).
Ограничение: Взять первые 3.

Не пишите код — только подумайте и запишите в комментарии, как это выглядело бы декларативно (в стиле Stream, но без синтаксиса).

Тестирование: Не нужно — это мысленный рефакторинг.

Анализ декларативного подхода (объёмно):

Нет временных коллекций: Цепочка преобразований на потоке — lazy, intermediate operations не создают полные списки.
Нет изменения состояния: Immutable pipeline — данные не мутируются, только преобразуются.
Нет индексов: Ограничение limit(3) — declarative, без ручного Math.min.
Процессы внутри: Filter O(n), sort O(n log n), map O(n), limit O(1).
Ловушки: Lazy evaluation — sort не выполняется, пока не terminal operation (limit).
Преимущества: Кратко, читаемо, легко паралелить (stream().parallel()).
Недостатки: Трудно дебажить (intermediate steps hidden), overhead для малого n.

Вывод: Декларативный подход заставляет думать о данных как о целом (поток), а не об отдельных элементах (циклы). Это рефакторит мышление к функциональному стилю, где фокус на "что", а не "как".
Тестирование и отладка

Императивный метод: Добавьте 10 книг, вызовите — проверьте результат.
Декларативный: Подумать, как цепочка упростит код (меньше строк, меньше ошибок).
Сравнение: Замерьте время для 1000 книг — императивный vs мысленный (для декларативного — представьте Stream).


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

Императив: Для низкоуровневого программирования и высокого контроля кода.
Декларатив: Для более высокого уровня программирования и читабельности.
Рефакторинг: Начните с императивного вида, перейдите к декларативному.

Практическое задание

Реализуйте императивный метод.
Опишите декларативно в комментариях.
Добавьте задачу: Найти 5 самых новых книг жанра "Y" — в двух стилях.


#Java #для_новичков #beginner #Практика #stream_api #declarative
👍4