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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Продвинутые аннотации и нюансы работы с датами

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 лет с момента выхода JDK 1.0

Ровно 29 лет назад, 23 января 1996 года, вышла первая мажорная версия JDK и с тех пор Java прочно заняла место рядах языков программирования.

С днем рождения, Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем серию постов для углубления недостаточно рассмотренных и актуальных тем.

Функциональное программирование

Функциональное программирование (ФП) — это парадигма программирования, в которой основным инструментом являются функции. В отличие от императивного программирования, где акцент делается на изменении состояния программы, ФП фокусируется на вычислениях через применение функций.

Ключевые идеи ФП:
Неизменяемость данных: Данные не изменяются после создания.
Чистые функции: Функции, которые не имеют побочных эффектов и возвращают одинаковый результат для одних и тех же входных данных.
Функции высшего порядка: Функции, которые могут принимать другие функции в качестве аргументов или возвращать их.


Основные принципы функционального программирования

Неизменяемость (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
Что выведет код

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
Please open Telegram to view this post
VIEW IN TELEGRAM
Поддержка функционального программирования в Java

Начиная с 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>): Сворачивает элементы в одно значение.


Пример использования:
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
Всем субботний привет! 😂

Как ваши дела и настроение? 🙃

Готовлю на завтра, по просьбам трудящихся (или учащихся), интеграцию проектов на Spring с внешними API.
Рассмотрим такие популярные способы, как RestTemplate, Feign, WebClient, Apache HttpClient и OkHttp.

Возможно даже что-то напишем
😜

Жду всех!
⭐️
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👍 - если часто возникает такое желание 🙂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!

Совсем забыл напомнить, что сегодня в 16:00 по МСК, жду Вас на встречу🤦‍♂️ 🤪

Сегодня рассмотрим интеграцию приложений Spring и не только с внешними API.

Приходите, ссылку скину сюда же 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбираем интеграцию приложения с внешними API. Немного про WebFlux. Встреча от 26.01.2025

Запись нашей встречи -
YOUTUBE
RUTUBE

На сегодняшней встрече мы разобрали на примере работу библиотек которые помогают связать наше приложение с внешними API:
— Рассмотрели такие популярные способы, как RestTemplate, Feign, WebClient и Apache HttpClient.
— Посмотрели как можно направить запрос и получить ответ из внешних сервисов.
— Коснулись верхами реактивного программирования, разобрали логику что такое реактивный запрос через WebFlux.
— Немного поговорили о взаимодействии приложений через API.


Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Всем хорошего настроения! 🤘🔫
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Функциональные интерфейсы.

Функциональный интерфейс — это интерфейс, который содержит только один абстрактный метод. Такой интерфейс может содержать множество default и static методов, но абстрактный метод должен быть только один. Функциональные интерфейсы используются для создания лямбда-выражений и ссылок на методы.

Функциональные интерфейсы позволяют писать более компактный и выразительный код, особенно при работе с лямбда-выражениями. Они являются основой для функционального программирования в Java.

Аннотация @FunctionalInterface

Java предоставляет аннотацию @FunctionalInterface, которая указывает, что интерфейс является функциональным. Эта аннотация не обязательна, но она помогает компилятору проверять, что интерфейс действительно содержит только один абстрактный метод. Если добавить второй абстрактный метод, компилятор выдаст ошибку.

Пример:
@FunctionalInterface
interface MyFunctionalInterface {
void execute(); // единственный абстрактный метод

default void print(String text) {
System.out.println(text);
}
}


Встроенные функциональные интерфейсы

Java предоставляет несколько встроенных функциональных интерфейсов в пакете java.util.function. Основные из них:
Predicate — принимает один аргумент и возвращает boolean.
Consumer — принимает один аргумент и не возвращает ничего.
Supplier — не принимает аргументов, но возвращает значение.
Function — принимает один аргумент и возвращает результат.


Эти интерфейсы покрывают большинство сценариев использования лямбда-выражений.

Плюсы и минусы функциональных интерфейсов

Плюсы:
Упрощают код, делая его более читаемым.
Позволяют использовать лямбда-выражения и ссылки на методы.
Поддерживают функциональное программирование.


Минусы:
Могут быть сложны для понимания новичками.
Чрезмерное использование может привести к снижению читаемости кода.


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


Функциональные интерфейсы могут содержать default и static методы, что делает их более гибкими.
Лямбда-выражения могут быть использованы только с функциональными интерфейсами.
Аннотация
@FunctionalInterface помогает избежать ошибок при добавлении лишних методов.

#Java #Training #Medium #Functional_programming #FunctionalInterface
Что выведет код?

public class Task270125 {
public static void main(String[] args) {
int a = 10_000;
long b = 10_000L;
double c = 10_000D;
float d = 10_000F;

System.out.println(a + b + c + d);
}
}


#Tasks