Java Portal | Программирование
11.6K subscribers
858 photos
66 videos
28 files
682 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл годную статью — подробный гайд по ООП в Java: принципы, концепты и реальные примеры. Если ты новичок или хочешь освежить базу — заходи смело. Всё объяснено доступно и с кодом. Приятного чтения 💪

> источник

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс JpaRepository

Это готовое решение для CRUD-операций. Просто унаследуйся от JpaRepository<Entity, ID> — и получи save, find, delete, update без лишнего кода

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает FlatMap в Java?

Mapping


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

Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.

Flattening

Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.

Синтаксис и параметры
для flatMap():

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)


> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-05-27_07-57-06.png
255 KB
Java Lombok: Аннотация @Data — всё в одном

Аннотация @Data объединяет в себе несколько часто используемых аннотаций Lombok:

> @ToString — генерирует метод toString()
> @Getter — создаёт геттеры для всех нестатических полей
> @Setter — создаёт сеттеры для всех нестатических полей
> @EqualsAndHashCode — генерирует equals() и hashCode()
> @RequiredArgsConstructor — создаёт конструктор для всех final и @NonNull полей

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 25: String::hashCode стал быстрее

В новой версии JDK 25 улучшили производительность класса String: теперь метод String::hashCode в большинстве случаев сворачивается на этапе компиляции (constant folding).

Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки

Подробнее: https://social.ora.cl/6014274Ew

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Каждый разработчик использует шаблоны проектирования ежедневно, даже не осознавая этого:

> Используешь DI, когда аннотируешь поле @Autowired или полагаешься на Spring для автосвязывания бинов.

> Вызываешь Executors.newFixedThreadPool() — это паттерн Factory, возвращающий настроенный объект.

> Передаёшь Comparator в Collections.sort() — это паттерн Strategy, позволяющий задать поведение на лету.

> PropertyChangeListener в Swing или ApplicationListener в Spring — это паттерн Observer.

> StringBuilder.append() — это паттерн Builder, пошагово создающий объект.

> Оборачиваешь BufferedReader вокруг InputStreamReader — это паттерн Decorator

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Batch упрощает управление ETL-задачами

Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам

Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий

Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык 🪑

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Звучит знакомо:

Почему у этого свойства такое значение?
С какой базой данных работает моё приложение?
Какие бины активны?

Встречайте Spring Debugger — плагин для IntelliJ IDEA, который показывает, что на самом деле происходит в вашем приложении с аннотацией @SpringBoot 🥺

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java API

Используйте @FunctionalInterface как защиту на уровне компиляции

Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку ☕️

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор показывает, как парсить структурированные строки в Java

Большинство разработчиков используют регулярные выражения, split() или ручную нарезку строк. Но эти техники подвержены ошибкам, плохо читаются и, что важнее всего — небезопасны на этапе компиляции.
Класс StringFormat делает парсинг настолько простым, что даже новичок может реализовать его в одну строку. 😃

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java: предпочитай внедрение через конструктор, а не через поля

На то есть разные причины:

> Зависимости можно пометить как final, гарантируя, что они не изменятся после создания.

> Повышает надёжность класса и безопасность при работе с потоками

> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости

> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор

> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.

> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Обрати внимание на JEP 505 — он упрощает конкурентное программирование, вводя API для структурированной конкуренции.

> https://openjdk.org/jeps/505

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
@CacheEvict, @CachePut и @Cacheable

Эти аннотации используются для управления кэшированием.

Сначала включим это, используя @EnableCaching, как показано ниже:

@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}


Пример:

@Service
public class ProductService {

private final ProductRepository productRepository;

public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}

@Cacheable(value = "products", key = "#id", condition = "#id > 0")
public Product getProductById(Long id) {
// Будет выполнен только если результат отсутствует в кэше
return productRepository.findById(id)
.orElseThrow(() -> new ProductNotFoundException(id));
}

@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
// Будет выполнен всегда, и результат обновит кэш
return productRepository.save(product);
}

@CacheEvict(value = "products", key = "#id")
public void deleteProduct(Long id) {
// Удалит запись из кэша
productRepository.deleteById(id);
}

@CacheEvict(value = "products", allEntries = true)
public void clearProductCache() {
// Полностью очистит кэш
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор делится, как писать удобные интеграционные тесты в Spring Boot

Многие разработчики либо перегружают @SpringBootTest, либо пишут сложные конструкции с @MockBean. Но такие подходы тормозят сборку, плохо читаются и, что важнее всего — дают ложное чувство покрытия.

Класс MockMvc и аннотация @WebMvcTest делают тестирование контроллеров лёгким и быстрым, можно проверить весь HTTP-флоу без запуска сервера.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Ищешь быстрый и удобный GUI для Git? Попробуй Gitnuro — кроссплатформенный клиент, написанный на Kotlin + Rust.

> Просмотр истории коммитов и изменений
> Стадирование, откат изменений (даже по отдельным строкам)
> Работа с ветками, тегами, и удалёнными репозиториями
> Поддержка операций pull, push, merge, rebase, stash
> Интерактивный rebase и просмотр blame
> Сравнение изображений и поддержка подмодулей
> Настраиваемые темы (JSON)
> Расширенный поиск по коммитам, авторам и ID 😊

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-06-02_08-13-46.png
1.3 MB
Шпаргалка по аннотациям безопасности Spring Security

@EnableWebSecurity —> Включает поддержку веб-безопасности Spring Security и интеграцию с Spring MVC. Применяется к конфигурационному классу для активации безопасности.

@EnableGlobalMethodSecurity / @EnableMethodSecurity (Spring Security 6+) —> Включает методный уровень безопасности (например, @PreAuthorize, @Secured). @EnableMethodSecurity — новая версия для Spring Security 6+.

@PreAuthorize("expression") —> Проверяет выражение SpEL до выполнения метода. Часто используется для ролевого доступа, например: @PreAuthorize("hasRole('ADMIN')").

@PostAuthorize("expression") —> Похожа на @PreAuthorize, но проверка происходит после выполнения метода. Полезно для фильтрации возвращаемых данных.

@Secured("ROLE_NAME") —> Разрешает доступ к методу только при наличии указанной роли. Менее гибкая, чем @PreAuthorize

@RolesAllowed("ROLE_NAME") —> Аннотация из JSR-250, ограничивает доступ по ролям. Требует включённой опции @EnableMethodSecurity(jsr250Enabled = true)

@AuthenticationPrincipal —> Внедряет текущего аутентифицированного пользователя (Principal или объект UserDetails) в контроллер или метод.

@WithMockUser —> Используется в тестах для эмуляции аутентифицированного пользователя с заданными ролями.

@PermitAll —> Разрешает доступ всем пользователям, включая неаутентифицированных. Требует поддержки JSR-250.

@DenyAll —> Запрещает доступ всем, включая аутентифицированных пользователей. Также входит в JSR-250.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Структурированное логгирование в Spring Boot 3.5.5

Spring Boot 3.5.5 привносит улучшенную поддержку структурированного логгирования.

Чтобы включить его, добавьте в application.yml следующее:

logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %X - %msg%n"


Теперь логи будут более чистыми и структурированными, что упрощает их парсинг в инструментах вроде ELK, Grafana или Datadog.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
10 однострочников на Java, с которыми ты выглядишь более опытным

🔸Поменять две переменные местами > a = a + b - (b = a);

🔸Создать список > List.of("Apple", "Banana", "Cherry");

🔸Найти максимум из двух чисел > Math.max(a, b);

🔸Прочитать все строки из файла > Files.readAllLines(Path.of("file.txt"));

🔸Объединить список в строку > String.join(", ", fruits);

🔸Удалить null-значения > list.removeIf(Objects::isNull);

🔸Получить случайный элемент > list.get(new Random().nextInt(list.size()));

🔸Посчитать совпадения > list.stream().filter(x -> x > 10).count();

🔸Отсортировать по убыванию > list.sort(Comparator.reverseOrder());

🔸Проверить палиндром str.equals(new StringBuilder(str).reverse().toString());

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл годную визуализацию для тех, кто хочет на пальцах понять, как устроены LLM. Тут можно не просто почитать про слои моделей, а буквально пощупать их, покрутить со всех сторон в 3D

Есть GPT-2, nanoGPT, GPT-2 XL и GPT-3

Лучше запускать с компа, на мобиле не так красиво

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставить @Transactional везде подряд плохая практика — сначала разберись, когда он действительно нужен:

🔸Использовать @Transactional только в сервисном слое — Отделяет бизнес-логику от веб-логики

🔸Использовать транзакции на уровне методов — Даёт точный контроль и ясность

🔸Использовать @Transactional(readOnly = true) — Оптимизирует операции только для чтения

🔸Избегать @Transactional в репозиториях — Репозитории не должны управлять транзакциями

🔸Оставлять транзакционные методы public — Необходимо для работы Spring-прокси

🔸Логировать или отслеживать поведение транзакций — Помогает выявлять неожиданные проблемы

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM