Java for Beginner
675 subscribers
548 photos
155 videos
12 files
839 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Варианты ответа:
Anonymous Quiz
13%
1 2 3 4 5
60%
1 2 4
0%
2 3 4 5
20%
1 2 4 5
7%
5 4 2 1
Или еще маленько подождать? 🤔 😃

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Продвинутые аннотации Lombok и лучшие практики

Аннотация @ExtensionMethod

Аннотация @ExtensionMethod позволяет добавлять методы-расширения к существующим классам. Это похоже на extension-методы в Kotlin или C#.

Пример использования:
import lombok.experimental.ExtensionMethod;
import java.util.Collections;

@ExtensionMethod(Collections.class)
public class ListUtils {
public void example() {
java.util.List<String> list = new java.util.ArrayList<>();
list.add("Hello");
list = unmodifiableList(list); // Метод из Collections
}
}


Как это работает под капотом:
Lombok преобразует вызовы методов-расширений в вызовы статических методов.

Сгенерированный код:
public class ListUtils {
public void example() {
java.util.List<String> list = new java.util.ArrayList<>();
list.add("Hello");
list = Collections.unmodifiableList(list);
}
}


Нюансы использования:
Методы-расширения должны быть статическими.
Аннотация находится в экспериментальном статусе и может измениться в будущем.


Аннотация @Accessors

Аннотация @Accessors настраивает поведение геттеров и сеттеров, например, позволяет создавать цепочные сеттеры.

Пример использования:
import lombok.experimental.Accessors;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Accessors(chain = true)
public class User {
private String name;
private int age;
}

// Использование:
User user = new User().setName("John").setAge(30);


Как это работает под капотом:
Lombok генерирует сеттеры, которые возвращают this, что позволяет использовать цепочки вызовов.

Сгенерированный код:
public class User {
private String name;
private int age;

public User setName(String name) {
this.name = name;
return this;
}

public User setAge(int age) {
this.age = age;
return this;
}
}


Нюансы использования:
Можно настроить префиксы для геттеров и сеттеров:
@Accessors(prefix = "m_")
private String m_name;


Аннотация @Wither

Аннотация @Wither создает методы для создания копии объекта с измененным значением одного поля. Это аналог @With, но находится в экспериментальном статусе.

Пример использования:
import lombok.experimental.Wither;

@Wither
public class User {
private final String name;
private final int age;

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

// Использование:
User user = new User("John", 30);
User newUser = user.withAge(31);


Как это работает под капотом:
Lombok генерирует методы withFieldName() для каждого поля.

Сгенерированный код:
public class User {
private final String name;
private final int age;

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

public User withName(String name) {
return this.name == name ? this : new User(name, this.age);
}

public User withAge(int age) {
return this.age == age ? this : new User(this.name, age);
}
}


Нюансы использования:
Работает только с final-полями.
Находится в экспериментальном статусе.


Аннотация @Helper

Аннотация @Helper создает локальные вспомогательные классы внутри методов.

Пример использования:
import lombok.experimental.Helper;

public class Example {
public void exampleMethod() {
@Helper
class LocalHelper {
void help() {
System.out.println("Helping!");
}
}
new LocalHelper().help();
}
}


Как это работает под капотом:
Lombok создает локальный класс, который можно использовать внутри метода.

Сгенерированный код:
public class Example {
public void exampleMethod() {
class LocalHelper {
void help() {
System.out.println("Helping!");
}
}
new LocalHelper().help();
}
}


Нюансы использования:
Находится в экспериментальном статусе.
Полезно для организации кода внутри методов.


#Java #Training #Spring #Lombok #ExtensionMethod #Accessors #Wither #Helper
Лучшие практики использования Lombok

Когда использовать Lombok:

Для сокращения шаблонного кода (геттеры, сеттеры, конструкторы).
Для улучшения читаемости кода.


Как избежать злоупотребления:
Не используйте Lombok для сложной логики.
Избегайте чрезмерного использования аннотаций, таких как
@Data или @AllArgsConstructor.

Совместимость с другими библиотеками:

Lombok может конфликтовать с Jackson, Hibernate и другими библиотеками. Будьте осторожны с аннотациями, которые генерируют методы.

Проблемы и ограничения Lombok

Проблемы с поддержкой в IDE:
Некоторые IDE могут некорректно обрабатывать код с Lombok. Убедитесь, что плагин Lombok установлен и настроен.

Ограничения при использовании с другими инструментами:
Например, Jackson может не работать с @Data, если не настроены правильные геттеры и сеттеры.

Отладка:
Поскольку сгенерированный код не отображается в исходниках, отладка может быть сложнее. Убедитесь, что ваша IDE поддерживает Lombok.

#Java #Training #Spring #Lombok #Best_practices
Всем доброго субботнего утра! ☀️

Как планируете провести выходные?

А я на завтра ничего не подготовил... Может кто хочет что-нибудь показать? 🧐

Кроме этого, у нас знаменательное событие - канал устойчиво достиг количества в 5⃣0⃣0️⃣ подписчиков 🥳

Много это или мало? Лично для меня - огромно!
Вспоминая как начинался этот канал с 15 подписчиками из интенсива JavaRush, сейчас цифра 500 человек воспринимается как значительное достижение.
Хотелось бы сказать "Спасибо
🙂" каждому, кто осознанно приписывает себя в постоянный состав подписчиков, тех кто не стесняясь приходит на воскресные встречи и принимает непосредственное участие в жизни канала.

Я рад что вы со мной.
🤝

А канал однозначно будет развиваться дальше. После изучения Java Core и Spring, пройдемся по фраймворкам с которыми взаимодействуешь каждый день, потом более редким, но эффективным и так далее... Будем однозначно встречаться по воскресениям и писать что-то злободневное для новичков 😁

Уверен что совместно, мы сделаем наш канал отличным подспорьем для развития Javистов-новичков, а так же платформой где можно пообщаться и узнать что-то новое!
👍

И не стесняйтесь что-то предлагать для развития канала!

Я не SMM-щик и в силу того, что все это делаю один, мне элементарно порой не хватает времени на свежие идеи
😎
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Всем привет! 🖐

Сегодня, как всегда в 16:00 по МСК, я организую встречу в Яндекс.Телемост.

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

Приходите, будет неинтересно
😏

😁😁😁
Please open Telegram to view this post
VIEW IN TELEGRAM
https://telemost.yandex.ru/j/09250961426847

Встреча создана, кому скучно - заходите
😂
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!

Начинаем серию постов для углубления недостаточно рассмотренных и актуальных тем.


Классы для работы с датами и временем в Java Time API

Java Time API (пакет java.time) был введен в Java 8 для замены устаревших классов Date и Calendar. Он предоставляет удобные и неизменяемые (immutable) классы для работы с датами и временем.

1. LocalDate

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

Пример использования:
LocalDate today = LocalDate.now(); // Текущая дата
LocalDate specificDate = LocalDate.of(2023, 10, 15); // Конкретная дата

System.out.println("Сегодня: " + today);
System.out.println("Конкретная дата: " + specificDate);


Плюсы:
Простота использования.
Неизменяемость (immutable), что делает его потокобезопасным.

Минусы:
Не поддерживает время и временные зоны.

2. LocalTime

Класс LocalTime представляет время без даты и временной зоны. Он используется для работы с временем, например, для учета времени начала и окончания событий.

Пример использования:

LocalTime now = LocalTime.now(); // Текущее время
LocalTime specificTime = LocalTime.of(14, 30); // Конкретное время

System.out.println("Сейчас: " + now);
System.out.println("Конкретное время: " + specificTime);


Плюсы:
Удобен для работы только с временем.
Неизменяемость.


Минусы:
Не поддерживает даты и временные зоны.

3. LocalDateTime

Класс LocalDateTime объединяет LocalDate и LocalTime, представляя дату и время без временной зоны. Он используется, когда нужно работать с датой и временем одновременно.

Пример использования:
LocalDateTime now = LocalDateTime.now(); // Текущая дата и время
LocalDateTime specificDateTime = LocalDateTime.of(2023, 10, 15, 14, 30); // Конкретная дата и время

System.out.println("Сейчас: " + now);
System.out.println("Конкретная дата и время: " + specificDateTime);


Плюсы:
Удобен для работы с датой и временем.
Неизменяемость.

Минусы:
Не поддерживает временные зоны.

4. ZonedDateTime

Класс ZonedDateTime расширяет LocalDateTime, добавляя информацию о временной зоне. Он используется для работы с датой и временем в конкретной временной зоне.

Пример использования:
ZonedDateTime nowInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); // Текущее время в Токио
ZonedDateTime specificDateTimeInNewYork = ZonedDateTime.of(2023, 10, 15, 14, 30, 0, 0, ZoneId.of("America/New_York"));

System.out.println("Сейчас в Токио: " + nowInTokyo);
System.out.println("Конкретное время в Нью-Йорке: " + specificDateTimeInNewYork);


Плюсы:
Поддержка временных зон.
Неизменяемость.


Минусы:
Сложнее в использовании из-за необходимости учитывать временные зоны.

5. Форматирование и парсинг: DateTimeFormatter

Класс DateTimeFormatter используется для форматирования и парсинга дат и времени. Он поддерживает множество предопределенных форматов, а также позволяет создавать собственные.

Пример использования:
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");

String formattedDateTime = now.format(formatter); // Форматирование
System.out.println("Форматированная дата и время: " + formattedDateTime);

LocalDateTime parsedDateTime = LocalDateTime.parse("15.10.2023 14:30:00", formatter); // Парсинг
System.out.println("Распарсенная дата и время: " + parsedDateTime);


Плюсы:
Гибкость в настройке форматов.
Поддержка локализации.


Минусы:
Требует внимательности при указании форматов, чтобы избежать ошибок.

#Java #Training #Medium #Date #LocalDate #LocalTime #LocalDateTime #ZonedDateTime #DateTimeFormatter
Что выведет код?

import java.time.LocalDate;
import java.time.Period;

public class Task200125_1 {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2024, 10, 1);
LocalDate date2 = LocalDate.of(2024, 9, 30);
Period period = Period.between(date1, date2);
System.out.println(period.getDays());
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
34%
1
7%
0
28%
-1
31%
RuntimeException
И покрытие тестами... 🤔 😃

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Работа с временными зонами, Duration и Period

1. Работа с временными зонами

В Java Time API временные зоны представлены классом ZoneId. Этот класс позволяет работать с различными временными зонами, такими как "Europe/Moscow", "America/New_York" и т.д. Временные зоны важны для корректного отображения времени в разных регионах мира.

Пример использования:

ZoneId londonZone = ZoneId.of("Europe/London");
ZoneId newYorkZone = ZoneId.of("America/New_York");

ZonedDateTime londonTime = ZonedDateTime.now(londonZone);
ZonedDateTime newYorkTime = ZonedDateTime.now(newYorkZone);

System.out.println("Текущее время в Лондоне: " + londonTime);
System.out.println("Текущее время в Нью-Йорке: " + newYorkTime);


Плюсы:
Поддержка всех временных зон мира.
Удобство работы с временными зонами.


Минусы:
Необходимость учитывать переход на летнее время (Daylight Saving Time, DST).

2. Класс Duration

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

Пример использования:
LocalTime startTime = LocalTime.of(14, 0);
LocalTime endTime = LocalTime.of(15, 30);

Duration duration = Duration.between(startTime, endTime);
System.out.println("Длительность: " + duration.toMinutes() + " минут");


Плюсы:
Точность до наносекунд.
Удобство для работы с короткими интервалами.


Минусы:
Не подходит для работы с большими интервалами (например, годами).

3. Класс Period

Класс Period используется для работы с временными интервалами, измеряемыми в годах, месяцах и днях. Он подходит для работы с длительными периодами, такими как возраст человека или срок действия договора.

Пример использования:
LocalDate startDate = LocalDate.of(2020, 1, 1);
LocalDate endDate = LocalDate.of(2023, 10, 15);

Period period = Period.between(startDate, endDate);
System.out.println("Период: " + period.getYears() + " лет, " + period.getMonths() + " месяцев, " + period.getDays() + " дней");


Плюсы:
Удобство для работы с длительными периодами.
Поддержка лет, месяцев и дней.


Минусы:
Не учитывает время и временные зоны.

4. Пример совместного использования Duration и Period

Иногда требуется работать как с короткими, так и с длительными интервалами. В таких случаях можно использовать Duration и Period вместе.

Пример использования:
LocalDateTime startDateTime = LocalDateTime.of(2020, 1, 1, 14, 0);
LocalDateTime endDateTime = LocalDateTime.of(2023, 10, 15, 15, 30);

Duration duration = Duration.between(startDateTime, endDateTime);
Period period = Period.between(startDateTime.toLocalDate(), endDateTime.toLocalDate());

System.out.println("Период: " + period.getYears() + " лет, " + period.getMonths() + " месяцев, " + period.getDays() + " дней");
System.out.println("Длительность: " + duration.toHours() + " часов");


Плюсы:
Гибкость в работе с различными интервалами.
Возможность комбинировать подходы.


Минусы:
Необходимость учитывать различия между Duration и Period.


5. Нюансы использования

Переход на летнее время: При работе с временными зонами важно учитывать переход на летнее время, который может изменить смещение временной зоны.
Неизменяемость: Все классы Java Time API являются неизменяемыми, что делает их потокобезопасными, но требует создания новых объектов при изменении значений.
Локализация: При форматировании дат и времени с использованием DateTimeFormatter можно учитывать локальные настройки пользователя.


#Java #Training #Medium #Date #Duration #Period
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Форматирование и парсинг дат с DateTimeFormatter

1. Создание кастомного формата с помощью DateTimeFormatter.ofPattern()

Класс DateTimeFormatter в Java используется для форматирования и парсинга дат и времени. С помощью метода ofPattern() можно создать кастомный формат, используя специальные символы. Например:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");


В DateTimeFormatter используется множество символов для создания кастомных форматов. Вот полный список основных вариантов:

1. Год (Year)
y или yyyy — год (4 цифры). Пример: 2023.
yy — год (2 цифры). Пример: 23.
u — год в формате ISO (аналогичен y, но поддерживает отрицательные годы). Пример: 2023.


2. Месяц (Month)
M — месяц (от 1 до 12). Пример: 1, 12.
MM — месяц (2 цифры). Пример: 01, 12.
MMM — сокращенное название месяца. Пример: Jan, Dec.
MMMM — полное название месяца. Пример: January, December.


3. День (Day)
d — день месяца (от 1 до 31). Пример: 1, 31.
dd — день месяца (2 цифры). Пример: 01, 31.
D — день года (от 1 до 366). Пример: 1, 365.
F — день недели в месяце (например, 2-й понедельник). Пример: 1, 2.


4. День недели (Day of Week)
E — сокращенное название дня недели. Пример: Mon, Sun.
EEEE — полное название дня недели. Пример: Monday, Sunday.


5. Час (Hour)
H — час в 24-часовом формате (от 0 до 23). Пример: 0, 23.
HH — час в 24-часовом формате (2 цифры). Пример: 00, 23.
h — час в 12-часовом формате (от 1 до 12). Пример: 1, 12.
hh — час в 12-часовом формате (2 цифры). Пример: 01, 12.
k — час в 24-часовом формате (от 1 до 24). Пример: 1, 24.
K — час в 12-часовом формате (от 0 до 11). Пример: 0, 11.


6. Минуты (Minutes)
m — минуты (от 0 до 59). Пример: 0, 59.
mm — минуты (2 цифры). Пример: 00, 59.


7. Секунды (Seconds)
s — секунды (от 0 до 59). Пример: 0, 59.
ss — секунды (2 цифры). Пример: 00, 59.
S — доли секунды (миллисекунды, наносекунды). Пример: 0, 999.


8. Временная зона (Time Zone)
z — название временной зоны. Пример: PST, GMT+03:00.
Z — смещение временной зоны в формате +HHMM или -HHMM. Пример: +0300, -0500.
X — смещение временной зоны в формате Z, ±HH:mm, ±HHmm или ±HH. Пример: Z, +03, +0300.
O — локальное смещение временной зоны. Пример: GMT+3.


9. Период дня (AM/PM)
a — маркер периода дня (AM/PM). Пример: AM, PM.

10. Эра (Era)
G — эра (до н.э. или н.э.). Пример: AD, BC.

Примеры использования

Полный формат даты и времени:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
System.out.println(now.format(formatter)); // Пример: 2023-10-25 14:30:00


Сокращенное название месяца и дня недели:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy, EEE");
LocalDate date = LocalDate.now();
System.out.println(date.format(formatter)); // Пример: 25 Oct 2023, Wed


Время с AM/PM:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss a");
LocalTime time = LocalTime.now();
System.out.println(time.format(formatter)); // Пример: 02:30:00 PM


Смещение временной зоны:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z");
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime.format(formatter)); // Пример: 2023-10-25 14:30:00 +0300


Нюансы использования

Регистр символов: Символы в DateTimeFormatter чувствительны к регистру. Например, MM — это месяц, а mm — минуты.
Повторение символов: Количество символов влияет на формат. Например, yyyy выводит год с 4 цифрами, а yy — с 2.
Экранирование символов: Если нужно вывести символ как текст (например, T в ISO_DATE_TIME), используйте одинарные кавычки: 'T'.


#Java #Training #Medium #Date #DateTimeFormatter
2. Форматирование LocalDateTime или ZonedDateTime в строку

Чтобы отформатировать объект LocalDateTime или ZonedDateTime в строку, используйте метод format():
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
System.out.println("Formatted DateTime: " + formattedDateTime);


Для ZonedDateTime:

ZonedDateTime zonedDateTime = ZonedDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
String formattedZonedDateTime = zonedDateTime.format(formatter);
System.out.println("Formatted Zoned DateTime: " + formattedZonedDateTime);


3. Парсинг строки обратно в объект


Чтобы преобразовать строку обратно в объект LocalDateTime или ZonedDateTime, используйте метод parse():
```
String dateTimeString = "2023-10-25 14:30:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println("Parsed DateTime: " + parsedDateTime);

Для ZonedDateTime:
String zonedDateTimeString = "2023-10-25 14:30:00 Europe/Moscow";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime parsedZonedDateTime = ZonedDateTime.parse(zonedDateTimeString, formatter);
System.out.println("Parsed Zoned DateTime: " + parsedZonedDateTime);


4. Стандартные форматы в DateTimeFormatter

Java предоставляет несколько стандартных форматов, которые можно использовать без создания кастомного DateTimeFormatter:
ISO_LOCAL_DATE — формат даты без времени (например, 2023-10-25).
ISO_DATE_TIME — полный формат даты и времени с часовым поясом (например, 2023-10-25T14:30:00+03:00).
ISO_LOCAL_DATE_TIME — формат даты и времени без часового пояса (например, 2023-10-25T14:30:00).

Пример использования стандартных форматов:
LocalDateTime now = LocalDateTime.now();
String isoLocalDateTime = now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println("ISO Local Date Time: " + isoLocalDateTime);

ZonedDateTime zonedNow = ZonedDateTime.now();
String isoDateTime = zonedNow.format(DateTimeFormatter.ISO_DATE_TIME);
System.out.println("ISO Date Time: " + isoDateTime);


Плюсы и минусы DateTimeFormatter

Плюсы:
Гибкость: можно создавать любые кастомные форматы.
Потокобезопасность: DateTimeFormatter является immutable и thread-safe.
Поддержка стандартных форматов.


Минусы:
Сложность: для сложных форматов требуется знание множества символов.
Ошибки парсинга: если строка не соответствует формату, будет выброшено исключение DateTimeParseException.


#Java #Training #Medium #Date #DateTimeFormatter