Что выведет код?
#Tasks
public class Task220125_1 {
public static void main(String[] args) {
try {
System.out.println("A");
throw new RuntimeException("B");
} catch (RuntimeException e) {
System.
out.println(e.getMessage());
} finally {
System.out.println("C");
}
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Работа с временными зонами
Почему важно хранить даты в UTC?
Универсальность: UTC — это стандарт, который не зависит от временных зон.
Согласованность: данные, хранящиеся в UTC, можно легко конвертировать в любую временную зону.
Избежание путаницы: исключаются ошибки, связанные с переходом на летнее время или разными временными зонами.
Пример конвертации из UTC в локальное время:
Обработка временных зон в веб-приложениях
Как принимать время от пользователя и конвертировать его в UTC?
Принимайте время от пользователя с указанием его временной зоны.
Используйте ZonedDateTime для конвертации в UTC.
Пример:
Проблемы с временными зонами
Неоднозначность времени при переходе на летнее время:
Например, в некоторых зонах время 2:30 может быть дважды (при переходе на зимнее время).
Решение:
Используйте ZonedDateTime и методы, которые учитывают такие случаи.
Разные форматы временных зон:
Например, "UTC+3" и "Europe/Moscow" могут означать одно и то же, но лучше использовать стандартные идентификаторы (например, "Europe/Moscow").
Ошибки при конвертации:
Убедитесь, что вы всегда знаете, в какой временной зоне находятся данные.
#Java #Training #Medium #Date #Best_Practicies
Почему важно хранить даты в UTC?
Универсальность: UTC — это стандарт, который не зависит от временных зон.
Согласованность: данные, хранящиеся в UTC, можно легко конвертировать в любую временную зону.
Избежание путаницы: исключаются ошибки, связанные с переходом на летнее время или разными временными зонами.
Пример конвертации из UTC в локальное время:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class UTCToLocalTime {
public static void main(String[] args) {
// Текущий момент в UTC
Instant now = Instant.now();
System.out.println("UTC: " + now);
// Конвертация в локальное время (например, для Москвы)
ZonedDateTime localTime = now.atZone(ZoneId.of("Europe/Moscow"));
System.out.println("Московское время: " + localTime);
}
}
Обработка временных зон в веб-приложениях
Как принимать время от пользователя и конвертировать его в UTC?
Принимайте время от пользователя с указанием его временной зоны.
Используйте ZonedDateTime для конвертации в UTC.
Пример:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class UserTimeToUTC {
public static void main(String[] args) {
// Время, введенное пользователем (например, 2023-10-15T14:30)
LocalDateTime userTime = LocalDateTime.parse("2023-10-15T14:30");
// Временная зона пользователя (например, Нью-Йорк)
ZoneId userZone = ZoneId.of("America/New_York");
ZonedDateTime userZonedTime = ZonedDateTime.of(userTime, userZone);
// Конвертация в UTC
ZonedDateTime utcTime = userZonedTime.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println("UTC время: " + utcTime);
}
}
Проблемы с временными зонами
Неоднозначность времени при переходе на летнее время:
Например, в некоторых зонах время 2:30 может быть дважды (при переходе на зимнее время).
Решение:
Используйте ZonedDateTime и методы, которые учитывают такие случаи.
Разные форматы временных зон:
Например, "UTC+3" и "Europe/Moscow" могут означать одно и то же, но лучше использовать стандартные идентификаторы (например, "Europe/Moscow").
Ошибки при конвертации:
Убедитесь, что вы всегда знаете, в какой временной зоне находятся данные.
#Java #Training #Medium #Date #Best_Practicies
Основные аннотации для работы с датами в Spring
В Spring работа с датами часто связана с аннотациями, которые упрощают обработку временных данных в приложениях.
1. @DateTimeFormat
Эта аннотация используется для форматирования дат и времени в полях объектов или параметрах методов. Она позволяет указать, как строковое представление даты должно быть преобразовано в объект LocalDate, LocalDateTime и другие типы.
Пример использования:
Здесь поле eventDate будет автоматически преобразовано из строки формата yyyy-MM-dd в объект LocalDate.
Как это работает под капотом:
Spring использует DateTimeFormatAnnotationFormatterFactory для обработки аннотации. Этот фабричный класс создает форматтер, который преобразует строку в объект даты и наоборот.
Плюсы:
Упрощает преобразование строк в даты.
Поддерживает различные форматы дат.
Минусы:
Если формат строки не совпадает с указанным в pattern, возникает исключение.
2. @JsonFormat
Эта аннотация используется для управления сериализацией и десериализацией дат в JSON. Она часто применяется в REST API для корректного отображения дат.
Пример использования:
Здесь eventDateTime будет сериализован в JSON в формате yyyy-MM-dd HH:mm:ss и десериализован обратно в объект LocalDateTime.
Как это работает под капотом:
Jackson (библиотека для работы с JSON) использует эту аннотацию для настройки ObjectMapper. Форматтер преобразует дату в строку и обратно.
Плюсы:
Удобно для работы с REST API.
Поддерживает временные зоны.
Минусы:
Требует настройки формата для каждого поля.
3. @Temporal
Эта аннотация используется в JPA для указания типа временного значения (DATE, TIME, TIMESTAMP). Она помогает базе данных правильно интерпретировать даты.
Пример использования:
Здесь eventDate будет сохранен в базе данных как TIMESTAMP.
Как это работает под капотом:
Hibernate (реализация JPA) использует эту аннотацию для определения типа SQL-столбца в базе данных.
Плюсы:
Упрощает работу с датами в базе данных.
Поддерживает различные типы временных данных.
Минусы:
Работает только с устаревшим типом java.util.Date.
#Java #Training #Spring #Date #DateTimeFormat #JsonFormat #Temporal
В Spring работа с датами часто связана с аннотациями, которые упрощают обработку временных данных в приложениях.
1. @DateTimeFormat
Эта аннотация используется для форматирования дат и времени в полях объектов или параметрах методов. Она позволяет указать, как строковое представление даты должно быть преобразовано в объект LocalDate, LocalDateTime и другие типы.
Пример использования:
public class Event {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate eventDate;
// Геттеры и сеттеры
}
Здесь поле eventDate будет автоматически преобразовано из строки формата yyyy-MM-dd в объект LocalDate.
Как это работает под капотом:
Spring использует DateTimeFormatAnnotationFormatterFactory для обработки аннотации. Этот фабричный класс создает форматтер, который преобразует строку в объект даты и наоборот.
Плюсы:
Упрощает преобразование строк в даты.
Поддерживает различные форматы дат.
Минусы:
Если формат строки не совпадает с указанным в pattern, возникает исключение.
2. @JsonFormat
Эта аннотация используется для управления сериализацией и десериализацией дат в JSON. Она часто применяется в REST API для корректного отображения дат.
Пример использования:
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC")
private LocalDateTime eventDateTime;
// Геттеры и сеттеры
}
Здесь eventDateTime будет сериализован в JSON в формате yyyy-MM-dd HH:mm:ss и десериализован обратно в объект LocalDateTime.
Как это работает под капотом:
Jackson (библиотека для работы с JSON) использует эту аннотацию для настройки ObjectMapper. Форматтер преобразует дату в строку и обратно.
Плюсы:
Удобно для работы с REST API.
Поддерживает временные зоны.
Минусы:
Требует настройки формата для каждого поля.
3. @Temporal
Эта аннотация используется в JPA для указания типа временного значения (DATE, TIME, TIMESTAMP). Она помогает базе данных правильно интерпретировать даты.
Пример использования:
@Entity
public class Event {
@Temporal(TemporalType.TIMESTAMP)
private Date eventDate;
// Геттеры и сеттеры
}
Здесь eventDate будет сохранен в базе данных как TIMESTAMP.
Как это работает под капотом:
Hibernate (реализация JPA) использует эту аннотацию для определения типа SQL-столбца в базе данных.
Плюсы:
Упрощает работу с датами в базе данных.
Поддерживает различные типы временных данных.
Минусы:
Работает только с устаревшим типом java.util.Date.
#Java #Training #Spring #Date #DateTimeFormat #JsonFormat #Temporal
Что выведет код?
#Tasks
public class Task230125 {
public static void main(String[] args) {
int i = 0;
do {
System.out.print(i + " ");
i++;
if (i == 3) break;
} while (i < 5);
System.out.print(i);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое enum в Java?
Что такое enum в Java?
Anonymous Quiz
2%
Это интерфейс для работы с исключениями.
13%
Это класс для работы с коллекциями.
0%
Это класс для работы с потоками.
85%
Это тип данных, который представляет набор констант.
Продвинутые аннотации и нюансы работы с датами
4. @CreatedDate и @LastModifiedDate
Эти аннотации используются в Spring Data JPA для автоматического управления полями, хранящими дату создания и дату последнего изменения.
Пример использования:
Поля createdAt и updatedAt автоматически заполняются при создании и обновлении сущности.
Как это работает под капотом:
Spring Data JPA использует AuditingEntityListener для отслеживания изменений сущностей и автоматического заполнения этих полей.
Плюсы:
Упрощает управление временными метками.
Не требует ручного обновления полей.
Минусы:
Требует настройки аудита в конфигурации Spring.
5. @Scheduled
Эта аннотация используется для запуска задач по расписанию. Она поддерживает работу с датами и временем для выполнения задач в определенные моменты.
Пример использования:
Как это работает под капотом:
Spring использует TaskScheduler для выполнения методов, помеченных этой аннотацией, в соответствии с указанным расписанием.
Плюсы:
Удобно для выполнения периодических задач.
Поддерживает сложные расписания через cron.
Минусы:
Требует настройки пула потоков для выполнения задач.
6. Нюансы работы с датами
Временные зоны: Всегда учитывайте временные зоны при работе с датами. Используйте @JsonFormat(timezone = "UTC") или ZonedDateTime.
Иммутабельность: Классы дат в Java (например, LocalDate, LocalDateTime) являются неизменяемыми. Это означает, что любые операции возвращают новый объект.
Сериализация: При работе с REST API убедитесь, что даты сериализуются и десериализуются в правильном формате.
#Java #Training #Spring #Date #CreatedDate #LastModifiedDate #Scheduled
4. @CreatedDate и @LastModifiedDate
Эти аннотации используются в Spring Data JPA для автоматического управления полями, хранящими дату создания и дату последнего изменения.
Пример использования:
@Entity
public class Event {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
// Геттеры и сеттеры
}
Поля createdAt и updatedAt автоматически заполняются при создании и обновлении сущности.
Как это работает под капотом:
Spring Data JPA использует AuditingEntityListener для отслеживания изменений сущностей и автоматического заполнения этих полей.
Плюсы:
Упрощает управление временными метками.
Не требует ручного обновления полей.
Минусы:
Требует настройки аудита в конфигурации Spring.
5. @Scheduled
Эта аннотация используется для запуска задач по расписанию. Она поддерживает работу с датами и временем для выполнения задач в определенные моменты.
Пример использования:
@Component
public class EventScheduler {
@Scheduled(cron = "0 0 12 * * ?") // Запуск каждый день в 12:00
public void scheduleEvent() {
System.out.println("Event scheduled at: " + LocalDateTime.now());
}
}
Как это работает под капотом:
Spring использует TaskScheduler для выполнения методов, помеченных этой аннотацией, в соответствии с указанным расписанием.
Плюсы:
Удобно для выполнения периодических задач.
Поддерживает сложные расписания через cron.
Минусы:
Требует настройки пула потоков для выполнения задач.
6. Нюансы работы с датами
Временные зоны: Всегда учитывайте временные зоны при работе с датами. Используйте @JsonFormat(timezone = "UTC") или ZonedDateTime.
Иммутабельность: Классы дат в Java (например, LocalDate, LocalDateTime) являются неизменяемыми. Это означает, что любые операции возвращают новый объект.
Сериализация: При работе с REST API убедитесь, что даты сериализуются и десериализуются в правильном формате.
#Java #Training #Spring #Date #CreatedDate #LastModifiedDate #Scheduled
Ровно 29 лет назад, 23 января 1996 года, вышла первая мажорная версия JDK и с тех пор Java прочно заняла место рядах языков программирования.
С днем рождения, Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем серию постов для углубления недостаточно рассмотренных и актуальных тем.
Функциональное программирование
Функциональное программирование (ФП) — это парадигма программирования, в которой основным инструментом являются функции. В отличие от императивного программирования, где акцент делается на изменении состояния программы, ФП фокусируется на вычислениях через применение функций.
Ключевые идеи ФП:
Неизменяемость данных: Данные не изменяются после создания.
Чистые функции: Функции, которые не имеют побочных эффектов и возвращают одинаковый результат для одних и тех же входных данных.
Функции высшего порядка: Функции, которые могут принимать другие функции в качестве аргументов или возвращать их.
Основные принципы функционального программирования
Неизменяемость (Immutability):
В ФП данные не изменяются после создания. Вместо этого создаются новые данные на основе существующих.
Преимущества:
Упрощение отладки и тестирования.
Потокобезопасность (нет состояния, которое может быть изменено несколькими потоками).
Недостатки:
Может потреблять больше памяти, так как создаются новые объекты вместо изменения существующих.
Пример:
Чистые функции (Pure Functions):
Чистая функция всегда возвращает одинаковый результат для одинаковых входных данных и не имеет побочных эффектов (например, не изменяет глобальное состояние).
Преимущества:
Предсказуемость и простота тестирования.
Упрощение параллельного выполнения.
Недостатки:
Иногда сложно избежать побочных эффектов в реальных приложениях.
Пример:
Функции высшего порядка (Higher-Order Functions):
Это функции, которые могут принимать другие функции в качестве аргументов или возвращать их.
Преимущества:
Гибкость и возможность создания абстракций.
Недостатки:
Может быть сложнее для понимания новичкам.
Пример:
Полезная для понимания вопроса, статья - https://habr.com/ru/articles/570642/
#Java #Training #Medium #Functional_programming
Функциональное программирование
Функциональное программирование (ФП) — это парадигма программирования, в которой основным инструментом являются функции. В отличие от императивного программирования, где акцент делается на изменении состояния программы, ФП фокусируется на вычислениях через применение функций.
Ключевые идеи ФП:
Неизменяемость данных: Данные не изменяются после создания.
Чистые функции: Функции, которые не имеют побочных эффектов и возвращают одинаковый результат для одних и тех же входных данных.
Функции высшего порядка: Функции, которые могут принимать другие функции в качестве аргументов или возвращать их.
Основные принципы функционального программирования
Неизменяемость (Immutability):
В ФП данные не изменяются после создания. Вместо этого создаются новые данные на основе существующих.
Преимущества:
Упрощение отладки и тестирования.
Потокобезопасность (нет состояния, которое может быть изменено несколькими потоками).
Недостатки:
Может потреблять больше памяти, так как создаются новые объекты вместо изменения существующих.
Пример:
// Императивный стиль (изменяемый)
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Kotlin");
// Функциональный стиль (неизменяемый)
List<String> immutableList = List.of("Java", "Kotlin");
Чистые функции (Pure Functions):
Чистая функция всегда возвращает одинаковый результат для одинаковых входных данных и не имеет побочных эффектов (например, не изменяет глобальное состояние).
Преимущества:
Предсказуемость и простота тестирования.
Упрощение параллельного выполнения.
Недостатки:
Иногда сложно избежать побочных эффектов в реальных приложениях.
Пример:
// Чистая функция
public static int add(int a, int b) {
return a + b;
}
// Нечистая функция (имеет побочный эффект)
public static int addAndLog(int a, int b) {
System.out.println("Adding " + a + " and " + b); // Побочный эффект
return a + b;
}
Функции высшего порядка (Higher-Order Functions):
Это функции, которые могут принимать другие функции в качестве аргументов или возвращать их.
Преимущества:
Гибкость и возможность создания абстракций.
Недостатки:
Может быть сложнее для понимания новичкам.
Пример:
// Функция высшего порядка
public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
List<T> result = new ArrayList<>();
for (T item : list) {
if (predicate.test(item)) {
result.add(item);
}
}
return result;
}
// Использование
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> evenNumbers = filter(numbers, n -> n % 2 == 0); // [2, 4]
Полезная для понимания вопроса, статья - https://habr.com/ru/articles/570642/
#Java #Training #Medium #Functional_programming
Хабр
Что такое функциональное программирование?
Эта статья является переводом материала «What is functional programming?». В этой статье Владимир Хориков попытается ответить на вопрос: что такое функциональное программирование? Функциональное...
Что выведет код❓
#Tasks
class Person {
private String name = "Alice";
String getName() {
return name;
}
}
public class Task240125 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.getName());
System.out.println(person.name);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое lambda в Java?
Что такое lambda в Java?
Anonymous Quiz
72%
Это анонимная функция.
6%
Это потокобезопасная коллекция.
14%
Это интерфейс для работы с потоками.
8%
Это ключевое слово для создания анонимных классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Поддержка функционального программирования в Java
Начиная с Java 8, язык получил мощные инструменты для поддержки функционального программирования:
Лямбда-выражения: Позволяют писать анонимные функции в компактной форме.
Функциональные интерфейсы: Интерфейсы с одним абстрактным методом (SAM), которые могут быть реализованы с помощью лямбда-выражений.
Stream API: Позволяет работать с коллекциями в функциональном стиле.
Лямбда-выражения
Лямбда-выражения — это краткий способ написания анонимных функций.
Они состоят из:
Списка параметров.
Стрелки (->).
Тела функции.
Синтаксис:
Примеры:
Простое лямбда-выражение:
Лямбда с параметрами:
Лямбда с несколькими строками:
Преимущества лямбда-выражений
Упрощение кода.
Улучшение читаемости.
Поддержка функционального стиля программирования.
Недостатки лямбда-выражений
Могут быть сложны для понимания новичкам.
Отладка лямбда-выражений может быть менее удобной.
Функциональные интерфейсы
Функциональные интерфейсы — это интерфейсы, которые содержат ровно один абстрактный метод (Single Abstract Method, SAM). Они используются для представления лямбда-выражений и ссылок на методы.
Примеры функциональных интерфейсов в Java:
Predicate<T>: Принимает один аргумент и возвращает boolean.
Function<T, R>: Принимает один аргумент и возвращает результат.
Consumer<T>: Принимает один аргумент и не возвращает результат.
Supplier<T>: Не принимает аргументов, но возвращает результат.
Пример использования:
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Начиная с Java 8, язык получил мощные инструменты для поддержки функционального программирования:
Лямбда-выражения: Позволяют писать анонимные функции в компактной форме.
Функциональные интерфейсы: Интерфейсы с одним абстрактным методом (SAM), которые могут быть реализованы с помощью лямбда-выражений.
Stream API: Позволяет работать с коллекциями в функциональном стиле.
Лямбда-выражения
Лямбда-выражения — это краткий способ написания анонимных функций.
Они состоят из:
Списка параметров.
Стрелки (->).
Тела функции.
Синтаксис:
(параметры) -> { тело функции }
Примеры:
Простое лямбда-выражение:
// Без лямбды
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// С лямбдой
Runnable runnable = () -> System.out.println("Hello, World!");
Лямбда с параметрами:
// Без лямбды
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
};
// С лямбдой
Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
Лямбда с несколькими строками:
// Без лямбды
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
};
// С лямбдой
Function<String, Integer> lengthFunction = s -> {
System.out.println("Calculating length of: " + s);
return s.length();
};
Преимущества лямбда-выражений
Упрощение кода.
Улучшение читаемости.
Поддержка функционального стиля программирования.
Недостатки лямбда-выражений
Могут быть сложны для понимания новичкам.
Отладка лямбда-выражений может быть менее удобной.
Функциональные интерфейсы
Функциональные интерфейсы — это интерфейсы, которые содержат ровно один абстрактный метод (Single Abstract Method, SAM). Они используются для представления лямбда-выражений и ссылок на методы.
Примеры функциональных интерфейсов в Java:
Predicate<T>: Принимает один аргумент и возвращает boolean.
Function<T, R>: Принимает один аргумент и возвращает результат.
Consumer<T>: Принимает один аргумент и не возвращает результат.
Supplier<T>: Не принимает аргументов, но возвращает результат.
Пример использования:
// Predicate
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
// Function
Function<String, Integer> lengthFunction = String::length;
System.out.println(lengthFunction.apply("Hello")); // 5
// Consumer
Consumer<String> printConsumer = System.out::println;
printConsumer.accept("Hello, World!");
// Supplier
Supplier<Double> randomSupplier = Math::random;
System.out.println(randomSupplier.get()); // Случайное число
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Stream API
Stream API — это мощный инструмент для работы с коллекциями в функциональном стиле. Он позволяет выполнять операции над данными, такие как фильтрация, преобразование, сортировка и агрегация, без изменения исходных данных.
Основные операции Stream API:
Промежуточные операции (intermediate): Возвращают новый поток и могут быть объединены в цепочку.
filter(Predicate<T>): Фильтрует элементы.
map(Function<T, R>): Преобразует элементы.
sorted(): Сортирует элементы.
Терминальные операции (terminal): Завершают поток и возвращают результат.
forEach(Consumer<T>): Выполняет действие для каждого элемента.
collect(Collector<T, A, R>): Собирает элементы в коллекцию.
reduce(BinaryOperator<T>): Сворачивает элементы в одно значение.
Пример использования:
Преимущества Stream API
Упрощение работы с коллекциями.
Поддержка параллельного выполнения (через parallelStream()).
Читаемость и выразительность кода.
Недостатки Stream API
Может быть менее производительным для простых операций из-за накладных расходов.
Сложность отладки из-за цепочек вызовов.
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces
Stream API — это мощный инструмент для работы с коллекциями в функциональном стиле. Он позволяет выполнять операции над данными, такие как фильтрация, преобразование, сортировка и агрегация, без изменения исходных данных.
Основные операции Stream API:
Промежуточные операции (intermediate): Возвращают новый поток и могут быть объединены в цепочку.
filter(Predicate<T>): Фильтрует элементы.
map(Function<T, R>): Преобразует элементы.
sorted(): Сортирует элементы.
Терминальные операции (terminal): Завершают поток и возвращают результат.
forEach(Consumer<T>): Выполняет действие для каждого элемента.
collect(Collector<T, A, R>): Собирает элементы в коллекцию.
reduce(BinaryOperator<T>): Сворачивает элементы в одно значение.
Пример использования:
List<String> languages = List.of("Java", "Kotlin", "Scala", "Groovy");
// Фильтрация и преобразование
List<String> filteredLanguages = languages.stream()
.filter(lang -> lang.startsWith("J")) // Фильтруем по условию
.map(String::toUpperCase) // Преобразуем в верхний регистр
.collect(Collectors.toList()); // Собираем в список
System.out.println(filteredLanguages); // [JAVA]
// Агрегация
int totalLength = languages.stream()
.mapToInt(String::length) // Преобразуем в длины строк
.sum(); // Суммируем длины
System.out.println(totalLength); // 18
Преимущества Stream API
Упрощение работы с коллекциями.
Поддержка параллельного выполнения (через parallelStream()).
Читаемость и выразительность кода.
Недостатки Stream API
Может быть менее производительным для простых операций из-за накладных расходов.
Сложность отладки из-за цепочек вызовов.
#Java #Training #Medium #Functional_programming #Stream_API #Lambda_expressions #Functional_interfaces