Java Portal | Программирование
Учись алгоритмам программирования с этим ресурсом - код, пошаговое выполнение и наглядное представление. Более 70 алгоритмов на JavaScript, Java и C++ - идеально для практики и понимания логики. → http://algorithm-visualizer.org 👉 Java Portal
Очень в тему перечитать этот классический материал от Майка Бостока. Отлично ложится как продолжение поста.
https://bost.ocks.org/mike/algorithms/
👉 Java Portal
https://bost.ocks.org/mike/algorithms/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
Есть забавная вещь, которая происходит со многими Java-разработчиками. Oни пишут современный код с мышлением старой Java.
И, если честно, их сложно за это винить.
Java менялась куда быстрее, чем комьюнити успевало к этим изменениям адаптироваться.
Годами Java ассоциировалась с огромными классами, кучей геттеров и сеттеров, громоздкими фабриками, бесконечными try/catch блоками. Со стороны казалось, что язык боится любого изменения.
Java была про структуры и правила.
Это был язык принципа = делай явно или не делай вообще.
Но потом подъехали серьезные обновления: лямбды, records, pattern matching, sealed-классы, streams, более выразительный switch, выведение типов, более декларативные API, и стиль, который стал ближе к функциональному.
У всего этого есть плюсы и минусы, понятно.
И внезапно Java перестала ощущаться языком начала двухтысячных и стала языком под 2025 год (ну или под 2020, кому как). Хотя многие до сих пор пишут так, будто на календаре 2010.
Но важно понимать! часто дело не в техническом выборе. Это может быть привычка, вкусы или просто невозможность перейти на новую версию.
И главный момент тут в том, что современная Java не заменяет классическую = они существуют параллельно. Хотя со временем, конечно, и "новая Java" тоже станет предметом споров и хейта, как старая.
Язык изменился, но команды, компании, легаси-фреймворки и технические решения десятилетней давности никуда не делись. Они тянут в обратную сторону и фактически продолжают поддерживать устаревшее представление о Java.
Java сегодня это умение жить сразу в двух эпохах.
Если ты понимаешь эту двойственность, тогда можешь использовать язык по максимуму.
Если нет, то просто будешь сражаться с прошлым, которого уже нет, и игнорировать настоящее, которое уже здесь и точно никуда не денется.
👉 Java Portal
И, если честно, их сложно за это винить.
Java менялась куда быстрее, чем комьюнити успевало к этим изменениям адаптироваться.
Годами Java ассоциировалась с огромными классами, кучей геттеров и сеттеров, громоздкими фабриками, бесконечными try/catch блоками. Со стороны казалось, что язык боится любого изменения.
Java была про структуры и правила.
Это был язык принципа = делай явно или не делай вообще.
Но потом подъехали серьезные обновления: лямбды, records, pattern matching, sealed-классы, streams, более выразительный switch, выведение типов, более декларативные API, и стиль, который стал ближе к функциональному.
У всего этого есть плюсы и минусы, понятно.
И внезапно Java перестала ощущаться языком начала двухтысячных и стала языком под 2025 год (ну или под 2020, кому как). Хотя многие до сих пор пишут так, будто на календаре 2010.
Но важно понимать! часто дело не в техническом выборе. Это может быть привычка, вкусы или просто невозможность перейти на новую версию.
И главный момент тут в том, что современная Java не заменяет классическую = они существуют параллельно. Хотя со временем, конечно, и "новая Java" тоже станет предметом споров и хейта, как старая.
Язык изменился, но команды, компании, легаси-фреймворки и технические решения десятилетней давности никуда не делись. Они тянут в обратную сторону и фактически продолжают поддерживать устаревшее представление о Java.
Java сегодня это умение жить сразу в двух эпохах.
Если ты понимаешь эту двойственность, тогда можешь использовать язык по максимуму.
Если нет, то просто будешь сражаться с прошлым, которого уже нет, и игнорировать настоящее, которое уже здесь и точно никуда не денется.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Spring Boot: Spring Data JPA имеет встроенную поддержку пагинации через Pageable.
Лучше использовать пагинацию в репозиториях вместо того, чтобы вытягивать все данные разом.
Вместо такого репозитория:
Лучше так:
И дальше в сервисном слое:
👉 Java Portal
Лучше использовать пагинацию в репозиториях вместо того, чтобы вытягивать все данные разом.
Вместо такого репозитория:
public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findAll();
}Лучше так:
public interface BookRepository extends JpaRepository<Book, Long> {
Page<Book> findAll(Pageable pageable);
}И дальше в сервисном слое:
public Page<Book> getBooks(int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending());
return bookRepository.findAll(pageable);
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
Java 21. Виртуальные потоки + структурированная конкуренция в 15 строках:
Запускай 100000+ конкурентных задач почти без оверхеда с виртуальными потоками.
Структурированная конкуренция делает async-код читаемым как синхронный, без утечек и callback-адского.
В реальных проектах даёт 10-кратный рост пропускной способности при гораздо более простом коде.
👉 Java Portal
Запускай 100000+ конкурентных задач почти без оверхеда с виртуальными потоками.
Структурированная конкуренция делает async-код читаемым как синхронный, без утечек и callback-адского.
В реальных проектах даёт 10-кратный рост пропускной способности при гораздо более простом коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4😁1
Всегда есть шанс, что один и тот же запрос прилетит в ваш API или сервер несколько раз.
Даже если вы отключаете кнопку после первого клика, вероятность уменьшается, но не исчезает.
Это решается идемпотентностью.
Идемпотентность — это когда одна и та же операция, выполненная несколько раз, даёт строго один и тот же результат.
Не похожий. Не почти такой же. А точно такой же.
Например, в платежных системах это обязательное свойство.
Это разница между стабильной системой и системой, которая может уронить бизнес.
Представим эндпоинт /payment/charge.
Если пользователь дважды жмёт кнопку оплатить, приложение не должно интерпретировать это как две транзакции.
По сути решение простое:
клиент отправляет idempotency-key, а сервер гарантирует, что операция будет выполнена только один раз.
Но правильная реализация важна.
Недостаточно просто игнорировать дубликаты. Нужно сохранять результат первой операции и возвращать его при повторных запросах, даже если второй запрос пришёл раньше, чем завершилась первая обработка.
Это значит, что потребуется хранить состояния, промежуточные результаты и думать об операции как о той, которую можно повторить без нарушения согласованности.
Без идемпотентности API ведет себя непредсказуемо.
С идемпотентностью можно пережить сетевые сбои, таймауты, повторные подключения и слишком быстрых юзеров, не ломая систему.
👉 Java Portal
Даже если вы отключаете кнопку после первого клика, вероятность уменьшается, но не исчезает.
Это решается идемпотентностью.
Идемпотентность — это когда одна и та же операция, выполненная несколько раз, даёт строго один и тот же результат.
Не похожий. Не почти такой же. А точно такой же.
Например, в платежных системах это обязательное свойство.
Это разница между стабильной системой и системой, которая может уронить бизнес.
Представим эндпоинт /payment/charge.
Если пользователь дважды жмёт кнопку оплатить, приложение не должно интерпретировать это как две транзакции.
По сути решение простое:
клиент отправляет idempotency-key, а сервер гарантирует, что операция будет выполнена только один раз.
Но правильная реализация важна.
Недостаточно просто игнорировать дубликаты. Нужно сохранять результат первой операции и возвращать его при повторных запросах, даже если второй запрос пришёл раньше, чем завершилась первая обработка.
Это значит, что потребуется хранить состояния, промежуточные результаты и думать об операции как о той, которую можно повторить без нарушения согласованности.
Без идемпотентности API ведет себя непредсказуемо.
С идемпотентностью можно пережить сетевые сбои, таймауты, повторные подключения и слишком быстрых юзеров, не ломая систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4
Совет по Spring Boot
RestTestClient для тестирования API
RestTestClient это единый инструмент для тестирования REST API, который можно использовать вместо WebTestClient, TestRestTemplate (удалён) или MockMVC.
1. Определи объект RestTestClient в тесте
2. Привяжи его к конкретному компоненту. Это может быть controller, MockMVC, server или Spring context
3. Потом используй RestTestClient в тесте
👉 Java Portal
RestTestClient для тестирования API
RestTestClient это единый инструмент для тестирования REST API, который можно использовать вместо WebTestClient, TestRestTemplate (удалён) или MockMVC.
1. Определи объект RestTestClient в тесте
2. Привяжи его к конкретному компоненту. Это может быть controller, MockMVC, server или Spring context
3. Потом используй RestTestClient в тесте
@SpringBootTest
public class PersonControllerWithHeadersTests {
private WebApplicationContext context;
private RestTestClient restTestClient;
@BeforeEach
public void setup(WebApplicationContext context) {
restTestClient = RestTestClient
.bindToApplicationContext(context)
.build();
}
@Test
void addPersonTest() {
restTestClient.post()
.uri("/persons")
.body(Instancio.create(Person.class))
.exchange()
.expectStatus().is2xxSuccessful()
.expectBody(Person.class)
.value(p -> assertNotNull(p.getId()));
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
Java-подсказка: начиная с Java 11, если нужно повторить строку n раз, можно использовать метод repeat(n) у String.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3🔥3😁1
Если у тебя начинают получаться сложные вложенные подзапросы, лучше перейти на CTE , чтобы сделать запросы читабельнее.
CTE позволяет вынести часть логики в отдельный блок и использовать результат как временную таблицу. Это помогает структурировать запросы и делать их понятнее.
👉 Java Portal
CTE позволяет вынести часть логики в отдельный блок и использовать результат как временную таблицу. Это помогает структурировать запросы и делать их понятнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Java-команды часто ищут прорывы не там.
Spring + JVM получает больше профита от Kotlin, чем от попыток перезабрести фреймворк.
Kotlin прокачивает базу.
А именно база решает, движется ли команда быстро или нет
1. Код становится проще.
Меньше шаблонного мусора.
Более безопасные дефолты.
Четче выраженные намерения.
Команда делает те же фичи быстрее и с меньшим количеством багов.
2. Работа с конкурентностью становится чище.
Коррутины стабильнее и удобнее, чем вечная возня с потоками.
Та же JVM. Тот же Spring.
Но асинхронный код наконец становится предсказуемым
3. Миграция с низкими рисками.
Никаких переписанных с нуля сервисов.
Никаких параллельных стеков.
Никакого большого взрыва.
Kotlin можно внедрять точечно - новые модули, новые сервисы, тесты, внутренние тулзы.
Эффект накапливается довольно быстро.
Так выглядит распространенный сценарий в успешных командах:
Один инженер пробует -> остальные замечают разницу -> adoption летит вверх.
4. Бизнес тоже ощущает разницу.
Меньше дефектов.
Быстрее онбординг.
Выше скорость разработки.
Лучше асинхронное поведение.
И все это без замены стека.
Kotlin не переписывает ваш проект.
Он исправляет мелочи, которые тормозят бекенд-команду годами.
Если ты уже на Spring + JVM, это самый выгодный апгрейд, который можно выкатить хоть завтра🍌
👉 Java Portal
Spring + JVM получает больше профита от Kotlin, чем от попыток перезабрести фреймворк.
Kotlin прокачивает базу.
А именно база решает, движется ли команда быстро или нет
1. Код становится проще.
Меньше шаблонного мусора.
Более безопасные дефолты.
Четче выраженные намерения.
Команда делает те же фичи быстрее и с меньшим количеством багов.
2. Работа с конкурентностью становится чище.
Коррутины стабильнее и удобнее, чем вечная возня с потоками.
Та же JVM. Тот же Spring.
Но асинхронный код наконец становится предсказуемым
3. Миграция с низкими рисками.
Никаких переписанных с нуля сервисов.
Никаких параллельных стеков.
Никакого большого взрыва.
Kotlin можно внедрять точечно - новые модули, новые сервисы, тесты, внутренние тулзы.
Эффект накапливается довольно быстро.
Так выглядит распространенный сценарий в успешных командах:
Один инженер пробует -> остальные замечают разницу -> adoption летит вверх.
4. Бизнес тоже ощущает разницу.
Меньше дефектов.
Быстрее онбординг.
Выше скорость разработки.
Лучше асинхронное поведение.
И все это без замены стека.
Kotlin не переписывает ваш проект.
Он исправляет мелочи, которые тормозят бекенд-команду годами.
Если ты уже на Spring + JVM, это самый выгодный апгрейд, который можно выкатить хоть завтра
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣5🔥3🤔2💊2🌭1
Какой Java Map быстрее для 1 млн обращений?
Производительность (в среднем):
HashMap выигрывает по сырым скоростям примерно в 15–20 раз.
TreeMap жертвует производительностью ради отсортированного порядка ключей.
HashMap использует хеширование с операциями за амортизированное константное время.
TreeMap использует красно-черное дерево, гарантируя O(log n), но за счет скорости.
Используй HashMap, когда важна скорость, и TreeMap, когда нужны отсортированные ключи или диапазонные запросы.
👉 Java Portal
Производительность (в среднем):
HashMap get(): ~0.8 ms (O(1))
TreeMap get(): ~15 ms (O(log n))
HashMap put(): ~1.2 ms
TreeMap put(): ~18 ms
HashMap выигрывает по сырым скоростям примерно в 15–20 раз.
TreeMap жертвует производительностью ради отсортированного порядка ключей.
HashMap использует хеширование с операциями за амортизированное константное время.
TreeMap использует красно-черное дерево, гарантируя O(log n), но за счет скорости.
Используй HashMap, когда важна скорость, и TreeMap, когда нужны отсортированные ключи или диапазонные запросы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍6🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Преподаватели берут то, с чем сами сталкиваются в повседневной работе Data Scientist, AI/ML Engineer, Data Engineer и Data Analyst, и превращают это в понятные практические упражнения.
Задачи в духе LeetCode, разбор живых кейсов, приёмы оптимизации. Всё, что позволяет уверенно чувствовать себя на собеседовании и дальше уже в команде.
После прохождения вы получите сертификат, который можно добавить в резюме.
В ближайшие 48ч курс доступен со скидкой 25% по промокоду «
BLACKFRIDAY25»: открыть курс на StepikPlease open Telegram to view this post
VIEW IN TELEGRAM
❤1
Быстрый Kafka consumer на виртуальных потоках.
Каждое новое сообщение, которое получает listener, обрабатывается в отдельном виртуальном потоке.
Естественно, при таком подходе теряется порядок сообщений внутри одного partition.
Выбирай, что для тебя важнее.
👉 Java Portal
Каждое новое сообщение, которое получает listener, обрабатывается в отдельном виртуальном потоке.
Естественно, при таком подходе теряется порядок сообщений внутри одного partition.
Выбирай, что для тебя важнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1