В Java 8 появился новый способ улучшить читаемость кода — ссылки на методы. Это позволяет ссылаться на существующие методы без их вызова, делая код более кратким и понятным.
🔍 Типы метод-референсов:
Пример: Integer::parseInt
Пример: myObject::toString
Пример: String::toUpperCase
Пример: ArrayList::new
⚡️ Пример использования:
Вместо стандартной лямбды:
list.forEach(item -> System.out.println(item));
Можно использовать ссылку на метод:
list.forEach(System.out::println);
А Вы используете ссылки на методы в своих проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤22👍8🔥2
VK Видео
Java. Рекурсия и цикл.
В видео рассматривается рекурсия как аналог цикла. Показано, как можно использовать хвостовую рекурсию в функциональных языках программирования. Канал автора: https://www.youtube.com/watch?v=GaIXsRuloqk
Java. Рекурсия и цикл.
В видео рассматривается рекурсия как аналог цикла. Показано, как можно использовать хвостовую рекурсию в функциональных языках программирования.
📺 🗣 СМОТРЕТЬ RUTUBE
🌐 🗣 СМОТРЕТЬ VKVIDEO
В видео рассматривается рекурсия как аналог цикла. Показано, как можно использовать хвостовую рекурсию в функциональных языках программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4👍3
REST (Representational State Transfer) — это архитектурный стиль предоставляющий стандарты для взаимодействия в распределённых системах. Он базируется на простоте, понятности и использует стандартные HTTP методы для взаимодействия между клиентом и сервером. Рой Филдинг впервые представил его в 2000 году в своей знаменитой диссертации. REST очень популярен, так как его легко реализовать, поддерживать и масштабировать.
▪️ GET — используется для получения данных. Например, запрос всех пользователей:
GET /users
▪️ POST — создаёт новый ресурс. Например, добавление нового пользователя:
POST /users
{
"name": "John",
"age": 30
}
▪️ PUT — обновляет ресурс. Например, обновление информации о пользователе:
PUT /users/1
{
"name": "John Doe",
"age": 31
}
▪️ PATCH — частично обновляет ресурс. Например, изменение email пользователя:
PATCH /users/1
{
"email": "john.new@example.com"
}
▪️ DELETE — удаляет ресурс. Например, удаление пользователя:
DELETE /users/1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥7❤6
StringBuffer
StringBuffer — это класс, предназначенный для работы со строками. Он позволяет создавать модифицируемые (изменяемые) строки.
В отличие от класса String, объекты StringBuffer можно изменять после их создания, используя различные методы, такие как append(), insert(), delete().
Также StringBuffer эффективнее String при частых изменениях строки, так как не создает новый объект при каждом изменении.
Класс является потокобезопасным, т. е. может использоваться в многопоточных приложениях.
Методы StringBuffer не синхронизированы, поэтому для многопоточного доступа нужно вручную синхронизировать доступ с помощью synchronized блока.
✅ Java библиотека #java
StringBuffer — это класс, предназначенный для работы со строками. Он позволяет создавать модифицируемые (изменяемые) строки.
В отличие от класса String, объекты StringBuffer можно изменять после их создания, используя различные методы, такие как append(), insert(), delete().
Также StringBuffer эффективнее String при частых изменениях строки, так как не создает новый объект при каждом изменении.
Класс является потокобезопасным, т. е. может использоваться в многопоточных приложениях.
Методы StringBuffer не синхронизированы, поэтому для многопоточного доступа нужно вручную синхронизировать доступ с помощью synchronized блока.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥8👍4😁3
Decorator — это структурный паттерн, который позволяет динамически добавлять объектам новые обязанности, оборачивая их в "декораторы". Это полезно для расширения функциональности без изменения существующего кода.
Использование:
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍10🔥6
Запуск Java SpringBoot + MySQL в Docker | Dockerfile + Docker compose
В этом видео я покажу, как запустить Spring Boot приложение с базой данных MySQL в Docker. Мы будем использовать Dockerfile для сборки приложения и Docker Compose для управления контейнерами. Это пошаговое руководство поможет вам быстро настроить среду разработки и развернуть приложение локально.
📺 🗣 СМОТРЕТЬ RUTUBE
🌐 🗣 СМОТРЕТЬ VKVIDEO
В этом видео я покажу, как запустить Spring Boot приложение с базой данных MySQL в Docker. Мы будем использовать Dockerfile для сборки приложения и Docker Compose для управления контейнерами. Это пошаговое руководство поможет вам быстро настроить среду разработки и развернуть приложение локально.
Please open Telegram to view this post
VIEW IN TELEGRAM
VK Видео
Запуск Java SpringBoot + MySQL в Docker | Dockerfile + Docker compose
В этом видео я покажу, как запустить Spring Boot приложение с базой данных MySQL в Docker. Мы будем использовать Dockerfile для сборки приложения и Docker Compose для управления контейнерами. Это пошаговое руководство поможет вам быстро настроить среду разработки…
👍11❤3🔥3😁2
Iterator — это поведенческий паттерн, который позволяет последовательно обходить элементы коллекции, не раскрывая ее внутреннюю структуру. Он обеспечивает единый интерфейс для работы с различными типами коллекций.
Использование:
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍6🔥4
System.nanoTime
System.nanoTime() возвращает текущее время в наносекундах.
Этот метод используется для измерения продолжительности выполнения небольших фрагментов кода.
В отличие от System.currentTimeMillis(), который возвращает время в миллисекундах, nanoTime() имеет более высокое разрешение и позволяет измерять очень короткие промежутки времени.
nanoTime() часто используется для:
— Замеров производительности.
— Измерения задержек в мультитрединге.
— Микробенчмаркинга.
— Определения интервалов между событиями в реальном времени.
✅ Java библиотека #java
System.nanoTime() возвращает текущее время в наносекундах.
Этот метод используется для измерения продолжительности выполнения небольших фрагментов кода.
В отличие от System.currentTimeMillis(), который возвращает время в миллисекундах, nanoTime() имеет более высокое разрешение и позволяет измерять очень короткие промежутки времени.
nanoTime() часто используется для:
— Замеров производительности.
— Измерения задержек в мультитрединге.
— Микробенчмаркинга.
— Определения интервалов между событиями в реальном времени.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🔥3
🔑 Encoding vs Encryption vs Tokenization: основные отличия
Кодирование, шифрование и токенизация — три разных процесса обработки данных для передачи, защиты и соблюдения стандартов безопасности. В системной архитектуре важно выбрать правильный метод для работы с конфиденциальной информацией.
🟢 Кодирование
Кодирование переводит данные в другой формат по легко обратимой схеме. Например, Base64 кодирует бинарные данные в текстовый формат для упрощения передачи через текстовые каналы. Кодирование не обеспечивает защиту данных, так оно легко обратимо без ключа.
🟢 Шифрование
Шифрование преобразует данные с помощью алгоритмов и ключей. Бывает симметричным (один ключ) и асимметричным (разные ключи). Оно защищает данные, превращая их в нечитаемый формат, который можно расшифровать только с правильным ключом.
🟢 Токенизация
Токенизация заменяет чувствительные данные безопасными токенами, связь которых с оригиналом хранится в защищенном хранилище. Токены используются в системах без риска утечки данных и полезны для соблюдения стандартов, таких как PCI DSS.
✅ Java библиотека #java
Кодирование, шифрование и токенизация — три разных процесса обработки данных для передачи, защиты и соблюдения стандартов безопасности. В системной архитектуре важно выбрать правильный метод для работы с конфиденциальной информацией.
Кодирование переводит данные в другой формат по легко обратимой схеме. Например, Base64 кодирует бинарные данные в текстовый формат для упрощения передачи через текстовые каналы. Кодирование не обеспечивает защиту данных, так оно легко обратимо без ключа.
Шифрование преобразует данные с помощью алгоритмов и ключей. Бывает симметричным (один ключ) и асимметричным (разные ключи). Оно защищает данные, превращая их в нечитаемый формат, который можно расшифровать только с правильным ключом.
Токенизация заменяет чувствительные данные безопасными токенами, связь которых с оригиналом хранится в защищенном хранилище. Токены используются в системах без риска утечки данных и полезны для соблюдения стандартов, таких как PCI DSS.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5❤4
Метод Math.random()
Используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.
Выше приведен пример выбора случайного числа в диапазоне от 0 до 10.
✅ Java библиотека #java
Используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.
Выше приведен пример выбора случайного числа в диапазоне от 0 до 10.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤5🔥3😁2
Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на изменения состояния других объектов. Наблюдатель предоставляет гибкую систему взаимодействия между объектами, исключая жесткую связанность.
Использование:
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍5🔥5
🤯 Зачем велосипеду Kafka?
Команда Яндекс Еды опубликовала мощный лонгрид о разработке своего умного электровелосипеда. Главная фишка — можно прямо в браузере покрутить детализированную 3D-модель и кликнуть на любой узел, от IoT-модуля до батареи, чтобы прочитать, как он устроен.
Что интересного в самой статье:
✅ Как справляются с потоком в 10 000 сообщений в секунду от тысяч велосипедов, используя связку MQTT и Kafka.
✅ Как байк определяет свою геолокацию без GPS и как курьер может разблокировать его по Bluetooth, если пропал интернет.
✅ Как устроен весь пайплайн: от IoT-модуля на самом велосипеде до облачных сервисов и интеграции с приложением Яндекс Про.
Отличный кейс для всех, кто работает с IoT и высоконагруженными системами.
Команда Яндекс Еды опубликовала мощный лонгрид о разработке своего умного электровелосипеда. Главная фишка — можно прямо в браузере покрутить детализированную 3D-модель и кликнуть на любой узел, от IoT-модуля до батареи, чтобы прочитать, как он устроен.
Что интересного в самой статье:
✅ Как справляются с потоком в 10 000 сообщений в секунду от тысяч велосипедов, используя связку MQTT и Kafka.
✅ Как байк определяет свою геолокацию без GPS и как курьер может разблокировать его по Bluetooth, если пропал интернет.
✅ Как устроен весь пайплайн: от IoT-модуля на самом велосипеде до облачных сервисов и интеграции с приложением Яндекс Про.
Отличный кейс для всех, кто работает с IoT и высоконагруженными системами.
❤9🔥6👍2
Тип Optional
Тип Optional используется для представления возможности отсутствия значения. Он обертывает другой тип данных и может содержать либо значение этого типа, либо быть пустым (null).
Этот код создает Optional объект, который может содержать строку. Если строка доступна, она будет возвращена; в противном случае будет возвращено значение «Default Value».
Использование Optional способствует более чистому и безопасному коду при работе с возможно отсутствующими значениями.
✅ Java библиотека #java
Тип Optional используется для представления возможности отсутствия значения. Он обертывает другой тип данных и может содержать либо значение этого типа, либо быть пустым (null).
Этот код создает Optional объект, который может содержать строку. Если строка доступна, она будет возвращена; в противном случае будет возвращено значение «Default Value».
Использование Optional способствует более чистому и безопасному коду при работе с возможно отсутствующими значениями.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍5🔥3
Media is too big
VIEW IN TELEGRAM
Java. Исключение ConcurrentModificationException.
В видео рассматривается, что из себя представляет исключение ConcurrentModificationException, и в каких случаях оно выбрасывается.
✅ Java библиотека #java
В видео рассматривается, что из себя представляет исключение ConcurrentModificationException, и в каких случаях оно выбрасывается.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤4🔥3
Введение в CompletableFuture
Когда дело касается выполнения асинхронных задач, класс CompletableFuture является мощным инструментом для упрощения работы с многопоточностью и асинхронным программированием. Он позволяет строить цепочки задач, обрабатывать ошибки и объединять несколько будущих значений без использования блокирующих операций.
CompletableFuture — это расширение интерфейса Future, которое упрощает работу с асинхронными вычислениями. В отличие от стандартного Future, он позволяет:
▪️ Запускать задачи асинхронно;
▪️ Комбинировать несколько задач;
▪️ Обрабатывать ошибки без try-catch;
▪️ Строить цепочки зависимостей.
Пример создания асинхронной задачи:
Здесь задача выполняется в фоновом потоке, а основной поток продолжает свою работу.
🎮 Комбинирование нескольких задач
Часто нужно дождаться завершения нескольких задач и собрать их результаты. С помощью thenCombine() можно комбинировать результаты нескольких асинхронных вычислений:
Здесь задачи выполняются параллельно, и их результаты комбинируются, когда обе завершены.
❌ Обработка ошибок
Одним из главных преимуществ CompletableFuture является возможность обрабатывать ошибки без try-catch через метод exceptionally():
Этот подход улучшает читаемость и упрощает обработку исключений в асинхронном коде.
📎 Композиция цепочек
Вы можете строить целые цепочки задач с помощью методов thenApply(), thenAccept() и т.д. Пример использования:
Каждая следующая задача запускается после завершения предыдущей, что позволяет гибко управлять зависимостями.
🛠 Применение на практике
CompletableFuture идеально подходит для задач, требующих асинхронности: запросы к API, обработка данных в фоне и т.д. Пример с вызовом нескольких API параллельно:
✅ Java библиотека #java
Когда дело касается выполнения асинхронных задач, класс CompletableFuture является мощным инструментом для упрощения работы с многопоточностью и асинхронным программированием. Он позволяет строить цепочки задач, обрабатывать ошибки и объединять несколько будущих значений без использования блокирующих операций.
CompletableFuture — это расширение интерфейса Future, которое упрощает работу с асинхронными вычислениями. В отличие от стандартного Future, он позволяет:
▪️ Запускать задачи асинхронно;
▪️ Комбинировать несколько задач;
▪️ Обрабатывать ошибки без try-catch;
▪️ Строить цепочки зависимостей.
Пример создания асинхронной задачи:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// Эмуляция долгой задачи
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Задача завершена!";
});
System.out.println(future.join()); // Ожидание завершения и получение результатаЗдесь задача выполняется в фоновом потоке, а основной поток продолжает свою работу.
Часто нужно дождаться завершения нескольких задач и собрать их результаты. С помощью thenCombine() можно комбинировать результаты нескольких асинхронных вычислений:
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 50);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
CompletableFuture<Integer> result = future1.thenCombine(future2, Integer::sum);
System.out.println(result.join()); // 70
Здесь задачи выполняются параллельно, и их результаты комбинируются, когда обе завершены.
Одним из главных преимуществ CompletableFuture является возможность обрабатывать ошибки без try-catch через метод exceptionally():
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("Ошибка!");
return 42;
}).exceptionally(ex -> {
System.out.println("Произошла ошибка: " + ex.getMessage());
return 0; // Возвращаем дефолтное значение в случае ошибки
});
System.out.println(future.join()); // 0Этот подход улучшает читаемость и упрощает обработку исключений в асинхронном коде.
Вы можете строить целые цепочки задач с помощью методов thenApply(), thenAccept() и т.д. Пример использования:
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + " World")
.thenAccept(finalResult -> System.out.println(finalResult)); // Hello World
Каждая следующая задача запускается после завершения предыдущей, что позволяет гибко управлять зависимостями.
🛠 Применение на практике
CompletableFuture идеально подходит для задач, требующих асинхронности: запросы к API, обработка данных в фоне и т.д. Пример с вызовом нескольких API параллельно:
CompletableFuture<String> api1 = CompletableFuture.supplyAsync(() -> {
// Эмуляция запроса к первому API
return "Response from API 1";
});
CompletableFuture<String> api2 = CompletableFuture.supplyAsync(() -> {
// Эмуляция запроса ко второму API
return "Response from API 2";
});
CompletableFuture<Void> allOf = CompletableFuture.allOf(api1, api2);
allOf.thenRun(() -> {
try {
System.out.println(api1.get() + " & " + api2.get());
} catch (Exception e) {
e.printStackTrace();
}
});Please open Telegram to view this post
VIEW IN TELEGRAM
❤19👍11🔥5
Интерфейс BlockingQueue
Интерфейс BlockingQueue используется для реализации очередей с блокировками.
Он позволяет безопасно работать с очередью из нескольких потоков.
Основные методы:
add(E e) — добавляет элемент в очередь, может выбросить исключение если очередь переполнена.
offer(E e) — добавляет элемент в очередь, возвращает false если очередь переполнена.
put(E e) — добавляет элемент в очередь, блокирует поток если очередь переполнена.
take() — извлекает и удаляет элемент из очереди, блокирует поток если очередь пуста.
poll() — извлекает и удаляет элемент из очереди, возвращает null если очередь пуста.
✅ Java библиотека #java
Интерфейс BlockingQueue используется для реализации очередей с блокировками.
Он позволяет безопасно работать с очередью из нескольких потоков.
Основные методы:
add(E e) — добавляет элемент в очередь, может выбросить исключение если очередь переполнена.
offer(E e) — добавляет элемент в очередь, возвращает false если очередь переполнена.
put(E e) — добавляет элемент в очередь, блокирует поток если очередь переполнена.
take() — извлекает и удаляет элемент из очереди, блокирует поток если очередь пуста.
poll() — извлекает и удаляет элемент из очереди, возвращает null если очередь пуста.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍9🔥3