Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
31 photos
2 videos
1.13K links
Download Telegram
🤔 Что такое денормализация баз данных?

Денормализация — это сознательное дублирование данных или объединение таблиц, чтобы:
- снизить количество JOIN'ов;
- ускорить чтение данных;
- упростить отчёты или агрегации.
Используется, когда производительность важнее избыточности. Пример: хранить имя пользователя рядом с заказом, а не связывать с таблицей пользователей.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
🤔 Какие Fetching Types знаешь в Hibernate и чем они отличаются?

В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.

🚩Lazy Fetching (ленивая загрузка)

Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в @OneToMany, @ManyToMany.
@Entity
class User {
@Id @GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders; // Загрузятся ТОЛЬКО при первом вызове getOrders()
}

User user = session.get(User.class, 1L);  // Загружается только User
List<Order> orders = user.getOrders(); // Запрос в БД выполняется ТОЛЬКО здесь


🚩Eager Fetching (жадная загрузка)

Hibernate загружает все связанные данные сразу, даже если они не нужны.
Увеличивает время выполнения запроса, так как делает JOIN или несколько отдельных запросов.
Используется по умолчанию в @ManyToOne, @OneToOne.
@Entity
class User {
@Id @GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Order> orders; // Загружается сразу при получении User
}

User user = session.get(User.class, 1L);  // Загружается User + сразу все его Orders


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🤔 Какие плагины можно поставить при создании виртуальной машины?

JVM можно расширить различными инструментами:
- JVisualVM или JProfiler для мониторинга производительности и анализа работы JVM.
- Heap Dump Analysis Tools для анализа состояния памяти при утечках.
- New Relic, Dynatrace для интеграции APM (Application Performance Monitoring).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15
🤔 Для чего нужен функциональный интерфейс BiConsumer<T,U>?

BiConsumer<T, U> — это функциональный интерфейс из пакета java.util.function, который принимает два входных аргумента и не возвращает результат.

Сигнатура BiConsumer<T, U>
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}


🚩Вывод пар значений

Допустим, у нас есть Map<String, Integer>, и мы хотим вывести все ключи и значения:
import java.util.Map;
import java.util.function.BiConsumer;

public class BiConsumerExample {
public static void main(String[] args) {
Map<String, Integer> map = Map.of("Alice", 30, "Bob", 25, "Charlie", 35);

// Используем BiConsumer для вывода ключа и значения
BiConsumer<String, Integer> printEntry = (key, value) ->
System.out.println("Имя: " + key + ", возраст: " + value);

// Применяем BiConsumer к каждому элементу Map
map.forEach(printEntry);
}
}


Вывод
Имя: Alice, возраст: 30  
Имя: Bob, возраст: 25
Имя: Charlie, возраст: 35


🚩Использование `BiConsumer` в `Stream`

Допустим, у нас есть список продуктов и их цены. Мы хотим увеличить цену каждого товара и напечатать результат.
import java.util.*;
import java.util.function.BiConsumer;

public class BiConsumerStreamExample {
public static void main(String[] args) {
Map<String, Double> products = new HashMap<>();
products.put("Хлеб", 50.0);
products.put("Молоко", 80.0);
products.put("Яблоки", 120.0);

// BiConsumer, который увеличивает цену и выводит её
BiConsumer<String, Double> increaseAndPrint = (name, price) -> {
double newPrice = price * 1.1; // +10%
System.out.println(name + " теперь стоит " + newPrice);
};

products.forEach(increaseAndPrint);
}
}


Вывод
Хлеб теперь стоит 55.0  
Молоко теперь стоит 88.0
Яблоки теперь стоят 132.0


🚩Объединение `BiConsumer` с `andThen()`

Метод andThen(BiConsumer<T, U>) позволяет объединять несколько действий в цепочку.
import java.util.function.BiConsumer;

public class BiConsumerChaining {
public static void main(String[] args) {
BiConsumer<String, Integer> printUser = (name, age) ->
System.out.println("Пользователь: " + name + ", возраст: " + age);

BiConsumer<String, Integer> checkAdult = (name, age) ->
System.out.println(name + (age >= 18 ? " совершеннолетний" : " несовершеннолетний"));

// Объединяем два BiConsumer'а
BiConsumer<String, Integer> combined = printUser.andThen(checkAdult);

combined.accept("Алексей", 20);
combined.accept("Мария", 16);
}
}


Вывод:
Пользователь: Алексей, возраст: 20  
Алексей совершеннолетний
Пользователь: Мария, возраст: 16
Мария несовершеннолетний


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15💊1
🤔 Можно ли переопределить метод и конструктор?

- Методы можно переопределять в дочерних классах, если они не final, не static и не private.
- Конструкторы нельзя переопределить, но можно перегрузить, создавая несколько вариантов с разными параметрами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3
🤔 Расскажи об этапах (фазах) жизненного цикла JSP.?

🟠Перевод (Translation)
JSP страница переводится в сервлетный Java-код. JSP контейнер анализирует содержимое JSP страницы и создает соответствующий сервлетный исходный код (.java файл).

🟠Компиляция (Compilation)
Сервлетный исходный код компилируется в байт-код, создавая .class файл (сервлет). Этот этап аналогичен компиляции обычного Java-кода.

🟠Загрузка (Loading)
Скомпилированный класс сервлета загружается в память. Контейнер загружает класс сервлета, чтобы он мог быть выполнен.

🟠Инициализация (Initialization)
Контейнер вызывает метод jspInit(). Этот метод вызывается один раз при первом создании сервлета или при перезапуске сервера и предназначен для выполнения инициализационных задач (например, настройка ресурсов).

🟠Обработка запросов (Request Processing)
Для каждого HTTP-запроса вызывается метод jspService(). Этот метод обрабатывает входящий запрос и генерирует соответствующий ответ. Основная работа по генерации динамического содержимого происходит на этом этапе.

🟠Завершение (Destruction)
Когда JSP страница выводится из эксплуатации (например, при остановке сервера), контейнер вызывает метод jspDestroy(). Этот метод используется для освобождения ресурсов (например, закрытие соединений с базой данных).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊9
🤔 Что такое mutual exclusion?

Mutual exclusion (взаимное исключение) — это механизм, который обеспечивает, что в критический участок кода в один момент времени может зайти только один поток, предотвращая состояния гонки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6
🤔 Опиши разницу типов данных DATETIME и TIMESTAMP?

В MySQL (и других реляционных БД) типы данных DATETIME и TIMESTAMP используются для хранения даты и времени, но у них есть несколько ключевых отличий.

🚩Когда использовать `DATETIME` и `TIMESTAMP`?

Используйте DATETIME, если:
Нужно хранить фиксированное значение даты и времени, не зависящее от часового пояса.
Работаете с датами за пределами 1970-2038 гг.
Требуется удобочитаемый формат (без конверсий).
Используйте TIMESTAMP, если:
Нужно учитывать часовой пояс (например, хранить время в UTC, а при запросе автоматически конвертировать в локальное).
Важно автоматическое обновление при изменении строки (ON UPDATE CURRENT_TIMESTAMP).
Нужно экономить память (занимает в 2 раза меньше места, чем DATETIME).

🚩Примеры

DATETIME (Фиксированная дата и время)
CREATE TABLE events (
id INT PRIMARY KEY,
event_time DATETIME NOT NULL
);

INSERT INTO events VALUES (1, '2025-02-17 12:30:00');


TIMESTAMP (Автообновление + Часовые пояса)
CREATE TABLE logs (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);


Если изменим time_zone, TIMESTAMP отобразится в новом часовом поясе.
SET time_zone = 'Europe/Moscow';
SELECT created_at FROM logs;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥3
🤔 Какие подклассы класса OutputStream есть, для чего они предназначены?

- FileOutputStream — запись байтов в файл;
- BufferedOutputStream — буферизированная запись для ускорения;
- DataOutputStream — запись примитивных типов данных;
- ObjectOutputStream — сериализация объектов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10
🤔 Роль `serialVersionUID` в сериализации

Это уникальный идентификатор версии класса, который используется механизмом сериализации для проверки совместимости классов при десериализации объектов. Он играет ключевую роль в предотвращении ошибок при изменении классов, участвующих в сериализации.

🚩Почему `serialVersionUID` важен?

🟠Гарантия совместимости при десериализации
Когда объект сериализуется (превращается в поток байтов), вместе с ним сохраняется и serialVersionUID. При десериализации JVM сравнивает serialVersionUID сохранённого объекта с serialVersionUID текущего класса. Если они не совпадают, выбрасывается исключение InvalidClassException, так как структура класса могла измениться.

🟠Предотвращение ошибок при изменениях класса
Если класс изменяется (например, добавляется новое поле), но serialVersionUID остаётся неизменным, JVM считает, что класс всё ещё совместим с более старой версией, и десериализация проходит успешно.

🟠Явное управление версиями
Если serialVersionUID не указан явно, JVM генерирует его автоматически на основе структуры класса. Это может привести к неожиданным проблемам, если класс изменится, так как автоматически вычисленный serialVersionUID изменится.

🚩Как использовать `serialVersionUID`?

import java.io.*;

class Person implements Serializable {
private static final long serialVersionUID = 1L; // Версия класса
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}


🚩Что будет, если не указать `serialVersionUID`?

Если не определить serialVersionUID, JVM сгенерирует его автоматически. Однако:
Он будет зависеть от структуры класса.
Малейшее изменение в коде (даже порядок методов) изменит serialVersionUID.
Это может привести к InvalidClassException при десериализации.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Что подразумевается под Классом-обёрткой (Class Wrapper)?

Класс-обёртка (Wrapper class) — это объектная оболочка для примитивного типа.
В Java каждый примитив имеет соответствующий класс-обёртку:
- int → Integer
- double → Double
- char → Character
- и т.д.
Зачем нужен:
- для использования примитивов там, где требуется объект (например, в коллекциях);
- поддержка null значений;
- работа с generic-кодом (List<Integer>).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1🤔1
🤔 Чем отличаются методы Thread.sleep() и Thread.yield()?

Методы Thread.sleep() и Thread.yield() в Java используются для управления потоком, но работают по-разному.

🚩Thread.sleep()

Метод Thread.sleep(milliseconds) приостанавливает выполнение текущего потока на указанное время.

🚩Как это работает?

Поток уходит в состояние "ожидания" (TIMED_WAITING).
Операционная система не даёт ему процессорное время в течение заданного времени.
После завершения паузы поток снова становится готовым к выполнению (RUNNABLE).

public class SleepExample {
public static void main(String[] args) {
System.out.println("Начало работы...");
try {
Thread.sleep(2000); // Пауза на 2 секунды
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Прошло 2 секунды");
}
}


Результат
Начало работы...
(пауза 2 секунды)
Прошло 2 секунды


🚩Thread.yield()

Метод Thread.yield() даёт возможность другим потокам выполнить работу.

🚩Как это работает?

Текущий поток передаёт управление планировщику (scheduler).
Если есть другие потоки с таким же или более высоким приоритетом, они получат процессорное время.
Если таких потоков нет, то текущий поток продолжит выполняться.

public class YieldExample {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
Thread.yield(); // Позволяет другим потокам выполняться
}
};

Thread t1 = new Thread(task, "Поток-1");
Thread t2 = new Thread(task, "Поток-2");

t1.start();
t2.start();
}
}


Результат (примерный, зависит от планировщика ОС)
Поток-1 - 1
Поток-2 - 1
Поток-1 - 2
Поток-2 - 2
...


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🎉Разыгрываем пожизненный доступ к AI-ассистенту для поиска работы для 3 подписчиков

До запуска Софи остается меньше месяца, поэтому мы решили порадовать вас и устроить конкурс, приуроченный к этому событию.

Кто такая Софи?
Это первый в России ассистент по поиску работы, который будет сам делать отклики, писать сопроводительные письма, поможет с резюме и подготовкой к собесу, а еще избавит тебя от отказов.

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

Мы посчитали, стоимость одной такой подписки ну хотя бы на 10 лет составляла бы 420.000 руб.

Условия конкурса простые:


1. Подписаться на 4 наших канала:
Софи и партнёры
Young & Junior - вакансии IT
Young Стажёр - стажировки ИТ
IT мероприятия для стажеров и студентов
2. Нажать кнопку "участвую" под этим постом.

15 июля, в 19:00, мы в прямом эфире проведем запуск Софи, а в 20:00 опубликуем результаты конкурса в канале Софи и Партнёры.

Каждый победитель получит бесплатный доступ к Софи навсегда.

Всем удачи и до встречи в прямом эфире🚀
💊2
🤔 Какое свойство задает цвет фона?

Свойство background-color в CSS задаёт цвет фона элемента.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊47🤔6👍4🔥1
🤔 Для чего нужны функциональные интерфейсы ObjDoubleConsumer<T>, ObjIntConsumer<T> и ObjLongConsumer<T>?

Эти интерфейсы предназначены для выполнения операций над объектом и примитивным значением (double, int, long) без возврата результата.

🚩`ObjDoubleConsumer<T>` – принимает объект + `double`
Используется, когда надо обработать объект + double, но ничего не возвращать.
import java.util.function.ObjDoubleConsumer;

class User {
String name;
double discount;

User(String name) {
this.name = name;
}

void setDiscount(double discount) {
this.discount = discount;
}
}

public class Main {
public static void main(String[] args) {
ObjDoubleConsumer<User> applyDiscount = (user, discount) -> user.setDiscount(discount);

User user = new User("Иван");
applyDiscount.accept(user, 10.5); // Применяем скидку

System.out.println(user.name + " получил скидку " + user.discount + "%");
// Иван получил скидку 10.5%
}
}


🚩`ObjIntConsumer<T>` – принимает объект + `int`

Используется, когда нужно обработать объект и int, но без возврата результата.
import java.util.function.ObjIntConsumer;

class Person {
String name;
int age;

Person(String name) {
this.name = name;
}

void setAge(int age) {
this.age = age;
}
}

public class Main {
public static void main(String[] args) {
ObjIntConsumer<Person> setPersonAge = (person, age) -> person.setAge(age);

Person person = new Person("Анна");
setPersonAge.accept(person, 30); // Устанавливаем возраст

System.out.println(person.name + " теперь " + person.age + " лет");
// Анна теперь 30 лет
}
}


🚩`ObjLongConsumer<T>` – принимает объект + `long`

Используется, когда нужно передать объект + long (например, ID, время) без возврата.
import java.util.function.ObjLongConsumer;

class Account {
String username;
long id;

Account(String username) {
this.username = username;
}

void setId(long id) {
this.id = id;
}
}

public class Main {
public static void main(String[] args) {
ObjLongConsumer<Account> setAccountId = (account, id) -> account.setId(id);

Account account = new Account("user123");
setAccountId.accept(account, 100000L); // Присваиваем ID

System.out.println("Аккаунт " + account.username + " имеет ID " + account.id);
// Аккаунт user123 имеет ID 100000
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊3🔥1
🤔 В чём проявляется изоляция или её отсутствие?

Изоляция — это когда операции одного процесса не влияют на параллельные процессы. Её отсутствие может приводить к конфликтам при одновременном доступе к данным, неконсистентности и гонкам данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Слышал ли что то про метод intern?

Метод intern() в классе String используется для оптимизации памяти.
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.

🚩Как работает `intern()`?

Без intern() – строки создаются в Heap (куче)
String s1 = new String("Hello"); // В куче (Heap)
String s2 = new String("Hello");

System.out.println(s1 == s2); // false (разные объекты)


С intern() – строки хранятся в String Pool
String s1 = new String("Hello").intern();
String s2 = new String("Hello").intern();

System.out.println(s1 == s2); // true (одна строка в String Pool)


🚩Что такое `String Pool`?

Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы ("Hello") по умолчанию хранятся в String Pool.
String s1 = "Hello"; // В String Pool
String s2 = "Hello"; // Ссылается на тот же объект

System.out.println(s1 == s2); // true


🚩Когда использовать `intern()`?

Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
List<String> names = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
names.add(("User" + (i % 100)).intern()); // Используем String Pool
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Какие плюсы у микросервисов есть перед монолитом?

- Масштабируемость отдельных компонентов;
- Независимое развертывание и обновление;
- Лучшая устойчивость (отказ одного сервиса не приводит к падению всей системы);
- Возможность использовать разные технологии и базы данных;
- Более чёткое разделение ответственности и команды могут работать автономно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Какие шаги нужно выполнить для прочтения текстового файла?

Для прочтения текстового файла в Java нужно выполнить несколько шагов.

1⃣Выбор метода чтения файла
В Java есть несколько способов читать текстовые файлы:
1. Использование класса FileReader.
2. Использование BufferedReader для построчного чтения.
3. Использование java.nio.file.Files для чтения всех строк файла.
4. Применение Scanner для гибкого чтения данных.

2⃣Открытие файла
Нужно указать путь к файлу (абсолютный или относительный) и передать его в выбранный класс. Например:
FileReader reader = new FileReader("file.txt");


3⃣Чтение данных
Выберите подходящий метод для обработки содержимого файла:
- Построчное чтение.
- Чтение символов.
- Чтение всех строк сразу (например, через Files.readAllLines).

4⃣Закрытие ресурса
Для освобождения системных ресурсов после работы с файлом нужно закрыть поток. Это делается вручную или с помощью конструкции try-with-resources.

🚩Примеры реализации

Построчное чтение с BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // Вывод строки
}
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}


Чтение файла с помощью Files
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class FileReadExample {
public static void main(String[] args) {
try {
List<String> lines = Files.readAllLines(Paths.get("file.txt"));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}


Чтение через Scanner
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileReadExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("file.txt"))) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine()); // Построчное чтение
}
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔1
🤔 Зачем может быть нужен private мьютекс?

Private мьютекс (private final Object lock = new Object()) используется для внутренней синхронизации, чтобы избежать внешнего воздействия: посторонний код не сможет получить доступ к мьютексу и изменить его состояние.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍5💊5
🤔 Какие методы самые важные и используются чаще всего?

В Java есть ключевые методы, которые активно применяются в программировании. Их можно разделить на общие методы Object, методы строк, коллекций и потоков.

🟠Важные методы `Object` (базовые для всех классов)
Каждый класс в Java наследует Object, поэтому эти методы важны для любой программы.
class Person {
String name;

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name);
}

@Override
public int hashCode() {
return name.hashCode();
}
}


🟠Важные методы `String` (работа со строками)
Строки в Java неизменяемы, поэтому методы создают новые объекты.
String text = "  Hello, Java!  ";
System.out.println(text.trim().toUpperCase()); // "HELLO, JAVA!"


Важные методы List, Set, Map (коллекции)
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
System.out.println(names.get(0)); // Alice

Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Alice");
uniqueNames.add("Alice");
System.out.println(uniqueNames.size()); // 1 (дубликат не добавился)


🚩Методы `Map` (HashMap, TreeMap)

Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
System.out.println(ages.get("Alice")); // 25


Stream API позволяет работать с данными декларативно.
List<String> names = List.of("Alice", "Bob", "Charlie");

names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊6