Java библиотека
31.6K subscribers
2.3K photos
78 videos
8 files
2.02K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
加入频道
Выше приведён список контролируемых исключений (Checked Exceptions) в Java, определенных в java.lang.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍125🔥2
Можно ли считать Final переменную константой?

Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable, то да, это константа.

А если тип данных mutable, то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍206🔥4
Как определить, содержит ли массив определенное значение в Java с помощью потоков?

Чтобы проверить, содержит ли массив значений int, double или long значение, используйте IntStream, DoubleStream или LongStream соответственно.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥621
🧑‍💻 Магия IntelliJ IDEA

Работаете в большом проекте и устали искать, где находится метод или переменная? IntelliJ IDEA умеет молниеносно прыгать к исходному коду — всё, что нужно, это Ctrl + B (или Cmd + B на macOS).

🟢Зачем это нужно

— Вместо ручного поиска по файлам вы сразу попадаете в нужное место в коде.
— Работает с методами, классами, интерфейсами, переменными, импортами и даже с SQL-мэппингами в JPA.

🟢Как использовать

— Наведите курсор на интересующий метод, переменную или класс.
— Нажмите Ctrl + B (или Cmd + B на macOS).
— IDEA мгновенно откроет определение — будь то в вашем коде, в сторонней библиотеке или в decompiled-классе.

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

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍266🔥4🤩1
👩‍💻 Генерим Spring Boot-фичи с AI

Нужно быстро набросать сервис для бизнес-функции? AI поможет сэкономить часы на шаблонах, валидации и boilerplate.

📝 Промпт:

Generate a Spring Boot REST endpoint that handles [описание бизнес-логики]. Include request/response DTOs, validation, exception handling, and service-layer interaction. Use best practices and explain design decisions.


💡 Дополнительные возможности:

— Добавьте Use Java 17+ features if possible, чтобы сразу писать современно
— Добавьте Add unit tests for controller and service, чтобы не откладывать на потом
— Добавьте Make it modular for future feature extension, если планируется масштабирование

А вы используете AI как «копилку шаблонов» или уже доверяете ему фичи под ключ?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍7🔥41
👩‍💻 Как добавить кастомные метрики в Spring Boot Actuator

В проде важно не просто «чтобы работало», а знать, как работает. Spring Boot Actuator позволяет получать системную информацию, но по-настоящему полезным он становится с кастомными метриками.

1️⃣ Добавьте зависимости

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>


Также добавьте экспорт метрик в application.yml:
management:
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
metrics:
export:
prometheus:
enabled: true


2️⃣ Создайте кастомную метрику

Например, метрика количества обращений к сервису:
@Component
public class CustomMetrics {

private final Counter requestCounter;

public CustomMetrics(MeterRegistry registry) {
this.requestCounter = Counter.builder("custom_requests_total")
.description("Total custom requests")
.register(registry);
}

public void countRequest() {
requestCounter.increment();
}
}


Теперь можно вызывать countRequest() в любом месте.

3️⃣ Интегрируйте в проект
@RestController
@RequiredArgsConstructor
public class MetricsTestController {

private final CustomMetrics customMetrics;

@GetMapping("/hello")
public String hello() {
customMetrics.countRequest();
return "Hello!";
}
}


Каждый вызов /hello увеличивает счётчик.

4️⃣ Проверьте метрику

Откройте в браузере или через curl:
http://localhost:8080/actuator/prometheus


Найдите строку:
custom_requests_total{...} 42.0


📌 Реальный профит: такие метрики позволяют строить Grafana-дэшборды, ставить алерты в Prometheus и быстро ловить аномалии.

Используете кастомные метрики или довольствуетесь встроенными?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132🔥2❤‍🔥1
Фишка Lombok — @With

Знаете, как в Java обычно обновить одно поле в неизменяемом объекте? Нужно создавать копию с нужным значением. Муторно. Lombok умеет делать это элегантно.

🟢Что делает @With

Генерирует методы withX(...), которые создают копию объекта с изменённым полем. Подходит для immutable-моделей и паттерна builder. Класс при этом должен быть final (например, через @Value или вручную).


🟢Пример
@Value
@With
public class User {
String name;
int age;
}


Теперь можно:
User user1 = new User("Alice", 25);
User user2 = user1.withAge(30); // создаётся новый объект с новым age


Объекты остаются неизменяемыми, но при этом легко "обновляемыми".

🟢Зачем это нужно

— Удобно при работе с immutable-классами.
— Простой способ "копировать с изменением".
— Чистый, декларативный стиль без boilerplate.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
426👍15🔥6🎉3
RSocket — протокол для реактивного взаимодействия между сервисами через TCP, WebSockets и Aeron. В отличие от традиционных HTTP-запросов, он поддерживает четыре модели обмена сообщениями: запрос-ответ, поток данных, fire-and-forget и бесконечные подписки на события.

Проект обладает zero-copy режимом для снижения задержек и Java-реализацией с интеграцией в Reactor. Подходит для микросервисов, где важны двунаправленная связь и эффективная работа с потоками данных.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥53
👩‍💻 Многопоточность в Spring Boot с AI

Есть бизнес-логика, которая требует многозадачности, но нужно сделать это грамотно и без лишних усилий? ИИ поможет сэкономить время на сложных аспектах работы с потоками и синхронизацией.

📝 Промпт:

Generate a Spring Boot service that processes [описание бизнес-логики] with multithreading support. Use Java concurrency features like ExecutorService, CompletableFuture, or @Async. Ensure thread safety, synchronization, and efficient thread pool management. Explain design decisions and trade-offs.


📌 Дополнительные возможности:

— Используйте Java 17+ features, чтобы сразу писать асинхронный и многозадачный код на современном уровне
— Добавьте Add thread pool management, чтобы контролировать нагрузку и избежать перегрузок
— Добавьте Add exception handling for multithreading, чтобы предотвратить ошибки в параллельных операциях

Как вы используете AI при разработке?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥4👍3
EA Async — асинхронный код в Java без головной боли. Этот необычный проект от Electronic Arts привносит в JVM-экосистему синтаксис async/await, знакомый разработчикам из C# и JavaScript. С ним асинхронные операции с CompletableFuture выглядят как последовательный код, сохраняя при этом все преимущества неблокирующего выполнения.

Библиотека трансформирует код на этапе компиляции — вы пишете блокирующий код с await, а под капотом генерируются цепочки thenCompose/thenApply. Работает с Java 8+ и Scala, а интеграция через Maven-плагин позволяет вообще исключить runtime-зависимости.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
6😁5
Чек-лист: эффективная работа с коллекциями в Java

Коллекции — база для любой бизнес-логики, но неправильный выбор структуры данных или операций приводит к тормозам и ошибкам.

🟢Выбор структуры данных

— ArrayList быстрый доступ по индексу, но медленная вставка/удаление в середине.
— LinkedList эффективен для частых вставок и удалений, но медленный случайный доступ.
— HashSet быстрая проверка наличия элемента, но не гарантирует порядок.
— LinkedHashSet сохраняет порядок вставки, но чуть медленнее.
— TreeSet упорядоченный набор, но операции дороже из-за балансировки дерева.

🟢Оптимизация операций

— Избегайте частых автокорректировок размера у ArrayList. Инициализируйте вместимость сразу, если размер известен.
— При массовой вставке используйте addAll() вместо последовательного add().
— Для поиска и фильтрации предпочитайте потоки (Stream API).

🟢Коллекции и многопоточность

— Для многопоточных сценариев используйте ConcurrentHashMap или CopyOnWriteArrayList.
— Помните, что Collections.synchronizedXXX() — это обертки с блокировкой, часто неэффективные для интенсивных операций.

🟢Память и производительность

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

🟢Дополнительно

— Используйте Collectors.toMap() и другие мощные инструменты Stream API для удобного преобразования и агрегации данных.
— В новых версиях Java появляются оптимизации и новые структуры (например, Immutable Collections в Java 9+).

Использовали LinkedList хоть раз?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍7🔥3
📚 Java & Related Concepts — полный гайд по Java-экосистеме. Этот репозиторий представляет собой целую энциклопедию для Java-разработчиков. Автор структурировал материал от основ языка до продвинутых тем: многопоточность, проектирование систем, алгоритмы и даже Kotlin с Android-разработкой.

Проект имеет полезные разделы с примерами кода: от классических паттернов вроде Singleton до задач на динамическое программирование. Для тех, кто готовится к собеседованиям, есть подборка LeetCode-шаблонов и реальных interview-задач.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥43
👩‍💻 Как настроить Spring Security с кастомной формой логина

Безопасность — базовая вещь. Spring Security по умолчанию кидает вас в дефолтную форму логина. Но в реальности — нужна своя, кастомная.

1️⃣ Добавьте зависимость
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>


2️⃣ Создайте SecurityConfig
@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/css/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/dashboard", true)
.permitAll()
)
.logout(logout -> logout
.logoutSuccessUrl("/login?logout")
);

return http.build();
}

@Bean
public UserDetailsService userDetailsService() {
var user = User.withUsername("admin")
.password("{noop}admin123") // Для простоты, без шифрования
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user);
}
}


3️⃣ Создайте кастомную HTML-форму

src/main/resources/templates/login.html (если используете Thymeleaf):
<!DOCTYPE html>
<html>
<head><title>Login</title></head>
<body>
<h2>Login</h2>
<form method="post" action="/login">
<label>Username: <input type="text" name="username" /></label><br/>
<label>Password: <input type="password" name="password" /></label><br/>
<button type="submit">Login</button>
</form>
</body>
</html>


4️⃣ Реализуете контроллер
@RestController
public class DashboardController {

@GetMapping("/dashboard")
public String dashboard() {
return "Welcome to the dashboard!";
}
}


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍11🔥5
👩‍💻 Интеграция брокеров сообщений в Spring Boot с AI

Поработать с Kafka или RabbitMQ, но нет времени вникать в тонкости конфигурации и шаблонного кода? AI справится с этим за секунды — с учётом лучших практик и особенностей выбранного брокера.

📝 Промпт:
Generate a Spring Boot service that integrates with [Kafka/RabbitMQ] to handle asynchronous message processing for [описание бизнес-задачи]. 
Include configuration, producer, and consumer code.
Ensure reliability with retry mechanisms, message acknowledgment, and error handling.
Use Spring Cloud Stream or native client APIs. Explain architectural choices and trade-offs.


💡 Дополнительные возможности:

— Добавьте Dead Letter Queue (DLQ) для обработки неуспешных сообщений
— Настройте observability (Micrometer + Prometheus/Grafana) для мониторинга очередей

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍6🔥5
🧑‍💻 Магия IntelliJ IDEA

Работаете в большом Java-проекте и боитесь, что при переименовании метода или переменной что-то сломаете? IntelliJ IDEA умеет безопасно и быстро переименовывать элементы кода с помощью Shift + F6.

🟢Зачем это нужно

— Вместо ручного поиска и замены по всему проекту IDEA обновит все ссылки на метод, переменную или класс автоматически.
— Переименование учитывает контекст — не затронет одноимённые элементы в других частях кода.
— Работает со всеми элементами: методами, классами, переменными, параметрами и даже с ресурсами.

🟢Как использовать

— Наведите курсор на имя метода, класса или переменной, которую хотите переименовать.
— Нажмите Shift + F6.
— Введите новое имя. IDEA покажет, где будет произведено переименование.
— Подтвердите и все ссылки обновятся мгновенно.

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

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥74
🖥 Stream API vs классический for-loop?

С тех пор как в Java 8 появился Stream API, начались споры: стоит ли массово переходить на стримы или классический for-loop по-прежнему лучше?

Сторонники Stream API говорят о выразительности, лаконичности и возможностях параллелизма. Противники указывают на потерю производительности в критичных местах и сложность отладки.

⚡️ На практике:

— Stream API отлично подходит для чистых операций с коллекциями и сложных цепочек преобразований.
— For-loop даёт полный контроль над процессом и зачастую работает быстрее, что важно в системах с высокими требованиями к производительности.

Вопрос к вам:

Что вы используете в повседневной работе?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥2
🌳 AVL, Red-Black и обычные BST — в чём разница и что использовать

Если вы работаете с алгоритмами или backend-структурами, важно понимать, чем отличаются разные виды бинарных деревьев поиска. Они вроде бы похожи, но ведут себя по-разному под нагрузкой.

📘 1. Обычное BST (Binary Search Tree)

🟢Это простое бинарное дерево, где:
> левый элемент < корень < правый элемент

🟢Плюсы:
– простая реализация
– отлично работает в идеальных условиях (например, сбалансированные данные)

🟢Минусы:
– если данные приходят в отсортированном виде — дерево вырождается в связный список
– время поиска, вставки, удаления может стать O(n) вместо O(log n)

📗 2. AVL-дерево

🟢Это самобалансирующееся BST, в котором:
> разница высот левого и правого поддерева никогда не превышает 1

🟢Плюсы:
очень быстрое чтение и поиск (потому что дерево строго сбалансировано)
– гарантированное O(log n) на все операции

🟢Минусы:
– при вставке и удалении может потребоваться много вращений, особенно при массовых изменениях
– чуть сложнее в реализации

📌 Используется, когда важна максимально быстрая навигация по дереву (например, базы данных, кэшированные индексы)

📕 3. Red-Black Tree (Красно-чёрное дерево)

🟢Более "гибкое" самобалансирующееся дерево
> баланс поддерживается за счёт цветов узлов и набора правил
> менее строгое, чем AVL, но быстрее на изменениях

🟢Плюсы:
– меньше вращений при вставке/удалении
лучше масштабируется, особенно при больших объёмах данных
– используется в TreeMap (Java), std::map (C++), Linux kernel

🟢Минусы:
– чуть менее сбалансировано, чем AVL
поиск может быть чуть медленнее, но разница минимальна

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

🧠 Итого:

| Структура | Быстрее при... | Баланс | Где применяется |
|----------------|------------------------|--------|----------------------------------------|
| **BST** | — (только в идеале) | нет | учебные задачи, простые деревья |
| **AVL** | Поиске | строгий | базы данных, индексы, словари |
| **Red-Black** | Вставке/удалении | ⚠️ умеренный | языковые stdlib, ядра, runtime-структуры |


🔗 Подробнее

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1
Реактивное программирование для масштабируемых приложений

Работаете с высоконагруженными системами и хотите писать неблокирующий, отзывчивый код? Project Reactor — это современная реактивная библиотека для Java, которая позволяет создавать эффективные, масштабируемые и устойчивые приложения.

🟢Зачем это нужно

— Обеспечивает асинхронную обработку данных с поддержкой backpressure — контроль потока данных, чтобы не перегружать систему.
— Улучшает использование ресурсов: вместо блокировки потоков реактивный код работает с событиями и колбэками.
— Позволяет строить сложные цепочки обработки с лаконичным и выразительным API (Flux, Mono).
— Отлично интегрируется с Spring WebFlux — современным реактивным веб-фреймворком.

🟢Как использовать

— Подключите зависимость reactor-core в проект.
— Используйте Mono<T> для 0-1 элемента, Flux<T> — для потоков данных.
— Пример:
Flux.just("user1", "user2", "user3")
.flatMap(this::fetchUserDetailsAsync)
.filter(user -> user.isActive())
.subscribe(user -> System.out.println("Active user: " + user.getName()));

— Обрабатывайте ошибки реактивно с помощью операторов onErrorResume, retry.
— Используйте Schedulers для переключения потоков и оптимизации выполнения.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥3
🌐 JTS Topology Suite — мощная Java-библиотека для работы с геометрией. Проект предоставляет инструменты для создания и манипуляции векторной геометрией, включая пространственные операции. Входит в рабочую группу LocationTech Eclipse Foundation и служит основой для многих GIS-решений.

В комплекте идёт TestBuilder с GUI для визуализации геометрии и тестирования функций. Библиотека особенно полезна разработчикам GIS-приложений систем пространственного анализа. На базе JTS построены популярные порты для C++, .NET и JavaScript.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2
👩‍💻 Интеграция Redis в Spring Boot с AI

Нужно быстро подключить Redis для кеширования, блокировок, хранения состояний или очередей задач — без лишней возни с конфигами и шаблонами? AI сгенерирует код под ключ — учитывая назначение, паттерны и лучшие практики.

📝 Промпт:
Generate a Spring Boot service that integrates with Redis to handle [caching / rate limiting / distributed locks / task queues] for [описание бизнес-логики].  
Include configuration, connection pooling, and example use cases.
Ensure reliability with TTL management, error handling, and fallback mechanisms.
Use Spring Data Redis or Lettuce/Jedis client. Explain the trade-offs of chosen technologies and patterns (e.g., Cache Aside, Write-Through).


💡 Дополнительные возможности:

— Добавьте also include support for Redis Streams (or Pub/Sub) for event-driven processing with examples для включения Redis Streams или Pub/Sub.
— Добавьте use Lua scripts for atomic operations and provide sample use cases (e.g., rate limiting or locking) для Lua-скриптов.
— Добавьте integrate Spring Boot Actuator and Redis metrics for monitoring cache performance (hit/miss, TTL, etc.) для мониторинга кеша и статистики.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2