🔍 Ответ на задачу про Stream.flatMap:
-
-
Вывод:
Вместо двух вложенных списков мы получим один стрим из 3-х символов: "a", "b", "c". Результат
⚡️ Не перепутайте:
Используйте
#java #streamapi #flatmap #basics #интервью #java_interview_tasks
-
map() превращает каждый элемент в другой элемент (1 -> 1). Если применить его здесь, мы получим стрим стримов: Stream<Stream<String>>.-
flatMap() превращает каждый элемент в стрим, а затем "склеивает" все эти стримы в один плоский Stream<String>.Вывод:
Вместо двух вложенных списков мы получим один стрим из 3-х символов: "a", "b", "c". Результат
count() — 3.⚡️ Не перепутайте:
Используйте
flatMap, когда ваш объект содержит коллекцию или Optional, и вы хотите работать с их содержимым напрямую.#java #streamapi #flatmap #basics #интервью #java_interview_tasks
🔥2👌1
🔍 Ответ на задачу про Stream.reduce: Опасность
Первый аргумент
Вычисление идет так:
В нашем случае:
Вывод:
Напечатается 16. Если вы хотите просто сумму — identity должен быть 0. Если произведение — 1.
⚡️ Не перепутайте:
Identity должен быть нейтральным элементом для вашей операции. Для сложения это 0, для умножения 1, для конкатенации строк — пустая строка.
#java #streamapi #reduce #basics #интервью #java_interview_tasks
identity 🚩Первый аргумент
reduce — это identity. Это значение, которое возвращается, если стрим пуст, и которое используется как начальное при вычислении.Вычисление идет так:
identity + element1 + element2...В нашем случае:
10 + 1 + 2 + 3 = 16.Вывод:
Напечатается 16. Если вы хотите просто сумму — identity должен быть 0. Если произведение — 1.
⚡️ Не перепутайте:
Identity должен быть нейтральным элементом для вашей операции. Для сложения это 0, для умножения 1, для конкатенации строк — пустая строка.
#java #streamapi #reduce #basics #интервью #java_interview_tasks
👍5❤1👌1
🔍 Ответ на задачу про LocalDate: Ловушка иммутабельности 📅
Классы из пакета
Вывод:
Напечатается 1. Чтобы получить 11, нужно было написать
⚡️ Не перепутайте:
Всегда проверяйте, что вы используете возвращаемое значение методов
#java #datetime #immutable #bug #basics #интервью #java_interview_tasks
Классы из пакета
java.time (LocalDate, LocalTime, etc.) — immutable (неизменяемые), как и String. Любой метод, который якобы "меняет" объект, на самом деле возвращает новый объект с измененным состоянием. Исходный объект date остается прежним.Вывод:
Напечатается 1. Чтобы получить 11, нужно было написать
date = date.plusDays(10).⚡️ Не перепутайте:
Всегда проверяйте, что вы используете возвращаемое значение методов
java.time. Это одна из самых частых ошибок при переходе со старого Calendar.#java #datetime #immutable #bug #basics #интервью #java_interview_tasks
🔥7👏2❤1👍1
🔍 Ответ на задачу про Records: Компактный конструктор 📝
В рекордах (Java 16+) есть "компактный конструктор". У него нет круглых скобок с параметрами. Он автоматически получает те же параметры, что объявлены в заголовке рекорда. Это идеальное место для валидации или нормализации данных (например,
Вывод:
Код скомпилируется и выбросит исключение. Это правильный способ гарантировать валидность данных в Immutable записях.
⚡️ Не перепутайте:
В компактном конструкторе не нужно писать
#java #records #java17 #clean_code #basics #интервью #java_interview_tasks
В рекордах (Java 16+) есть "компактный конструктор". У него нет круглых скобок с параметрами. Он автоматически получает те же параметры, что объявлены в заголовке рекорда. Это идеальное место для валидации или нормализации данных (например,
name = name.trim()).Вывод:
Код скомпилируется и выбросит исключение. Это правильный способ гарантировать валидность данных в Immutable записях.
⚡️ Не перепутайте:
В компактном конструкторе не нужно писать
this.name = name, Java сделает это сама в конце.#java #records #java17 #clean_code #basics #интервью #java_interview_tasks
👍8❤1🔥1
🔍 Ответ на задачу про Sealed Classes: Закрытая иерархия 🔒
Ключевое слово
Наследники
Вывод:
⚡️ Не перепутайте:
Sealed-классы отлично работают вместе с Pattern Matching в
#java #java17 #sealedclasses #oop #basics #интервью #java_interview_tasks
Ключевое слово
sealed (Java 17) разрешает наследование только тем классам, которые перечислены в списке permits. Любой другой класс (как Triangle) получит ошибку компиляции при попытке расширить Shape.Наследники
sealed класса обязаны быть либо final, либо sealed, либо non-sealed (открывающим иерархию обратно).Вывод:
Triangle нет в списке разрешенных. Поэтому вариант с Triangle не скомпилируется.⚡️ Не перепутайте:
Sealed-классы отлично работают вместе с Pattern Matching в
switch, позволяя компилятору проверять, все ли возможные подтипы вы обработали.#java #java17 #sealedclasses #oop #basics #интервью #java_interview_tasks
✍5
🔍 Ответ на задачу про Switch Expressions: yield или return? 🔄
В новых switch expressions (Java 14+) если вам нужно выполнить несколько действий в одном
Вывод:
Сначала выполнится
⚡️ Не перепутайте:
#java #switch #java14 #basics #syntax #интервью #java_interview_tasks
В новых switch expressions (Java 14+) если вам нужно выполнить несколько действий в одном
case, вы используете блок {}. Чтобы вернуть значение из такого блока наружу в переменную, используется ключевое слово yield.Вывод:
Сначала выполнится
System.out.print, затем значение "Result" вернется в переменную. Итого: OneResult.⚡️ Не перепутайте:
yield используется только внутри switch. Не пытайтесь использовать его вместо return в обычных методах.#java #switch #java14 #basics #syntax #интервью #java_interview_tasks
👌5
🔍 Ответ на задачу про Pattern Matching: Прощай, кастинг! 👋
В Java 16 появился Pattern Matching for instanceof. Теперь мы можем объявить переменную
Вывод:
Так как длина строки 10 (> 5), условие сработает. Результат:
⚡️ Не перепутайте:
Переменная
#java #java16 #patternmatching #basics #syntax #интервью #java_interview_tasks
В Java 16 появился Pattern Matching for instanceof. Теперь мы можем объявить переменную
s прямо в проверке. Если obj является строкой, Java сама сделает приведение типов и запишет результат в s. Область видимости s ограничена блоком if.Вывод:
Так как длина строки 10 (> 5), условие сработает. Результат:
HELLO JAVA.⚡️ Не перепутайте:
Переменная
s доступна только там, где компилятор уверен в её инициализации. Например, в if (...) { здесь s доступна }.#java #java16 #patternmatching #basics #syntax #интервью #java_interview_tasks
✍5
🔍 Ответ на задачу про Text Blocks: Считаем пробелы 📏
Текстовые блоки используют "алгоритм смещения" (incidental whitespace). Java находит самую левую границу текста во всем блоке (в данном случае это начало слова "World") и считает её за "ноль". Всё, что находится левее этой границы, отбрасывается.
Вывод:
Так как "Hello" смещено на 2 пробела относительно "World", в итоговой строке перед ним останется именно 2 пробела.
⚡️ Не перепутайте:
Положение закрывающих кавычек
#java #java15 #textblocks #syntax #basics #интервью #java_interview_tasks
Текстовые блоки используют "алгоритм смещения" (incidental whitespace). Java находит самую левую границу текста во всем блоке (в данном случае это начало слова "World") и считает её за "ноль". Всё, что находится левее этой границы, отбрасывается.
Вывод:
Так как "Hello" смещено на 2 пробела относительно "World", в итоговой строке перед ним останется именно 2 пробела.
⚡️ Не перепутайте:
Положение закрывающих кавычек
""" тоже влияет на отступы! Если вы сдвинете их левее текста, это создаст дополнительные пробелы.#java #java15 #textblocks #syntax #basics #интервью #java_interview_tasks
🔥6❤3👍1
🔍 Ответ на задачу про var: Не всё так просто с null 🚫
Ключевое слово
Однако, если сделать явное приведение
Вывод:
Не скомпилируется только строка 3.
⚡️ Не перепутайте:
#java #java10 #var #inference #basics #интервью #java_interview_tasks
Ключевое слово
var (Java 10+) выводит тип переменной на основе инициализатора. Если мы пишем var c = null, компилятор не имеет ни малейшего представления, список это, строка или ваш кастомный класс. Поэтому такая запись запрещена.Однако, если сделать явное приведение
(String) null, тип становится известен, и var сработает.Вывод:
Не скомпилируется только строка 3.
⚡️ Не перепутайте:
var — это не динамическая типизация как в JS. Тип определяется один раз при компиляции и не может быть изменен позже.#java #java10 #var #inference #basics #интервью #java_interview_tasks
❤5👍1🔥1
🔍 Ответ на задачу про Virtual Threads: Опасность synchronized 📌
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри
Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать
⚡️ Не перепутайте:
Это не значит, что
#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри
synchronized блока или вызывают нативный метод. Это называется Pinning. Если ваш код делает тяжелые сетевые вызовы внутри synchronized, вы можете забить все системные потоки и свести на нет всю пользу от виртуальных потоков.Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать
ReentrantLock, так как он не вызывает закрепления потока.⚡️ Не перепутайте:
Это не значит, что
synchronized — зло. Если операция внутри блока быстрая (просто инкремент), закрепление не будет проблемой.#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
👍4🔥1
🔍 Ответ на задачу про ReentrantLock: Попытка не пытка 🚪
Метод
Вывод:
Поток напечатает "Busy" и не будет блокироваться.
⚡️ Не перепутайте:
При использовании
#java #concurrency #multithreading #reentrantlock #интервью #java_interview_tasks
Метод
tryLock() — неблокирующий. Он мгновенно возвращает true, если замок удалось захватить, и false, если нет. Это позволяет потоку избежать ожидания и заняться чем-то другим или реализовать свою логику повторных попыток.Вывод:
Поток напечатает "Busy" и не будет блокироваться.
⚡️ Не перепутайте:
При использовании
lock() всегда вызывайте unlock() в блоке finally. Со synchronized об этом заботится сама JVM.#java #concurrency #multithreading #reentrantlock #интервью #java_interview_tasks
🔥4👍1🤨1
🔍 Ответ на задачу про Semaphore: Кто потерял ключи? 🔑
В отличие от многих других синхронизаторов,
Вывод:
Код напечатает 2. Это свойство часто используют для передачи сигналов между потоками: один поток ждет (
⚡️ Не перепутайте:
Если вам нужен строгий замок, где отдать ключ может только тот, кто его взял — используйте
#java #concurrency #semaphore #multithreading #интервью #java_interview_tasks
В отличие от многих других синхронизаторов,
Semaphore в Java — это просто счетчик. Метод release() просто увеличивает счетчик разрешений на единицу. Ему совершенно всё равно, вызывали ли вы acquire() до этого.Вывод:
Код напечатает 2. Это свойство часто используют для передачи сигналов между потоками: один поток ждет (
acquire), а другой подает сигнал о готовности (release).⚡️ Не перепутайте:
Если вам нужен строгий замок, где отдать ключ может только тот, кто его взял — используйте
ReentrantLock.#java #concurrency #semaphore #multithreading #интервью #java_interview_tasks
🔥2❤1👍1