Приглашаем на митап Мир Plat.Form «Платежные технологии: биометрия и быстрые кешбэки»
🌐 Онлайн
📆 20 декабря в 17:00 (МСК, GMT+3)
В программе — два доклада:
🗣 Идентификация и оплата: как работает платформа биометрических сервисов (ПБС) — Сергей Лысенко, Алексей Бобруцков
Определим место НСПК в биоэквайринге. Поговорим об архитектуре и механизмах ПБС. Выясним, как совершается оплата с точки зрения клиента, с кем в разных процессах взаимодействует команда и как технологию применяют в нефинансовых сервисах.
🗣 Быстрые кешбэки для быстрых платежей: как работает платформа лояльности СБП — Константин Гузаров
Разберем, что скрывается под капотом программы лояльности «Привет!» в части СБП. Обсудим механику акций, потоки данных внутри системы лояльности, требования к сервису и историю его развития.
Вы сможете задать вопросы спикерам в чате митапа. За лучшие вопросы Мир Plat.Form подарит призы.
Регистрируйтесь на сайте митапа.
Реклама. АО "НСПК". ИНН 7706812159
⚙️ Optional.flatMap()
В Java метод Optional.flatMap()
позволяет преобразовать значение внутри Optional, возвращая другой Optional. Это особенно полезно для работы с вложенными Optional.
👩💻 Задача по Java: Удаление дубликатов из списка с сохранением порядка
Напишите метод, который принимает список строк и возвращает новый список, содержащий только уникальные строки, сохраняя их порядок появления.
Пример:
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> input = List.of("apple", "banana", "apple", "orange", "banana");
List<String> result = removeDuplicates(input);
System.out.println(result);
// Ожидаемый результат: [apple, banana, orange]
}
}
#вопросы_с_собеседований
Что такое ForkJoinPool в Java, как он работает, и как его использовать для параллельной обработки задач?
Ответ ⬇️
ForkJoinPool — это специализированный пул потоков, который рекурсивно делит задачи на подзадачи (fork) и объединяет их результаты (join). Он оптимизирован для задач, которые можно разделить на независимые части, например, вычисление суммы элементов массива. Основными классами являются RecursiveTask для задач с результатом и RecursiveAction для задач без результата.
Пример использования ⚙️
import java.util.concurrent.RecursiveTask;Читать полностью…
import java.util.concurrent.ForkJoinPool;
class SumTask extends RecursiveTask<Integer> {
private final int[] array;
private final int start, end;
public SumTask(int[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end - start <= 5) {
int sum = 0;
for (int i = start; i < end; i++) sum += array[i];
return sum;
} else {
int mid = (start + end) / 2;
SumTask left = new SumTask(array, start, mid);
SumTask right = new SumTask(array, mid, end);
left.fork();
return right.compute() + left.join();
}
}
}
public class Main {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ForkJoinPool pool = new ForkJoinPool();
int result = pool.invoke(new SumTask(array, 0, array.length));
System.out.println("Сумма: " + result); // Сумма: 55
}
}
⚙️ List.subList()
В Java метод subList()
позволяет создать представление части списка. Это удобно для работы с подмножествами коллекций без необходимости копирования элементов.
⚙️ Math.round()
В Java метод Math.round()
округляет число до ближайшего целого значения. Это полезно для обработки чисел с плавающей запятой, если требуется округление до ближайшего целого.
⚙️ String.replace()
В Java метод String.replace()
заменяет все вхождения указанного символа или подстроки в строке на новое значение. Это удобно для модификации строк без необходимости создания сложных шаблонов.
⚙️ String.startsWith() и String.endsWith()
В Java методы String.startsWith()
и String.endsWith()
проверяют, начинается или заканчивается строка на указанную подстроку. Это удобно для работы с текстами и валидации.
⌛ Что будет выведено при выполнении кода?
Пояснение ⬇️
Метод divide вызывает исключение ArithmeticException, так как деление на ноль недопустимо. Исключение перехватывается в блоке catch, где его сообщение выводится. После этого выполняется блок finally, который всегда исполняется независимо от того, было исключение или нет.Читать полностью…
⚙️HashMap.getOrDefault()
В Java метод HashMap.getOrDefault()
возвращает значение для заданного ключа, если он существует, или значение по умолчанию, если ключ отсутствует. Это удобный способ избежать проверки на наличие ключа.
❓ Вопрос на собеседовании
Как работает CompletableFuture
в Java, чем он отличается от Future, и как использовать метод thenCombine()
для выполнения параллельных задач?
Ответ ⬇️
CompletableFuture — это расширение Future, позволяющее выполнять асинхронные задачи и комбинировать их без необходимости вручную управлять потоками. В отличие от Future, он предоставляет богатый API для обработки результатов, включая цепочку методов и возможность комбинирования нескольких задач. Метод thenCombine() используется для объединения результатов двух асинхронных задач, выполняемых параллельно, в одну итоговую операцию.
Пример использования ⚙️
import java.util.concurrent.CompletableFuture;Читать полностью…
public class Main {
public static void main(String[] args) {
// Первая асинхронная задача
CompletableFuture<Integer> task1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Эмуляция задержки
} catch (InterruptedException e) {
e.printStackTrace();
}
return 10;
});
// Вторая асинхронная задача
CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> 20);
// Комбинируем результаты двух задач
CompletableFuture<Integer> combined = task1.thenCombine(task2, Integer::sum);
// Получаем и выводим результат
combined.thenAccept(result -> System.out.println("Сумма: " + result));
// Ждем завершения всех задач (только для примера)
combined.join();
}
}
// Результат выполнения:
// Сумма: 30
⚙️ Stream.reduce()
В Java метод Stream.reduce()
выполняет свёртку элементов потока в одно значение, используя заданную ассоциативную функцию. Это мощный инструмент для операций, таких как суммирование, произведение или объединение.
➡️ Pebble — современный движок шаблонов для Java
Pebble — это гибкий и производительный движок шаблонов, который позволяет легко интегрировать динамический HTML в ваши приложения. Разработанный с акцентом на расширяемость и безопасность, Pebble поддерживает удобный синтаксис, похожий на Twig.•
Компактный синтаксис: интуитивно понятный синтаксис для построения шаблонов.•
Шаблоны высокого уровня: поддержка наследования и макросов.•
Безопасность: автоматическое экранирование HTML и поддержка WhiteList-фильтров.•
Расширяемость: добавление пользовательских функций и фильтров.
🔗 Ссылочка на доку
⚙️ Math.max()
В Java метод Math.max()
позволяет найти большее из двух чисел. Он работает с различными типами данных, такими как int
, double
, float
, и полезен в задачах сравнения.
⚙️ List.of()
В Java метод List.of()
позволяет быстро создать неизменяемый список. Это удобно для создания небольших коллекций с фиксированным набором элементов.
⚙️ Collectors.toMap()
В Java метод Collectors.toMap()
собирает элементы потока в карту (Map), где вы можете указать функции для ключей и значений. Это удобно для преобразования коллекций в структуру ключ-значение.
Вы опытный Java-разработчик, но хотите большего?
📚 Углубитесь в устройство JVM, научитесь профилировать приложения, оптимизировать их для облаков и развертывать в Kubernetes. Это повышение квалификации для тех, кто готов выйти на новый уровень.
👉 Вы освоите реактивный подход, работу с метриками и логированием, научитесь анализировать дампы памяти и создавать REST API с OpenAPI и Protobuf.
🎁 Присоединяйтесь к курсу «Java Developer. Advanced» и получите скидку! Ваша карьера в IT ждет апгрейда: https://otus.pw/Tsfk/Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👩💻 Задача по Java: Binary Addition
Реализуйте функцию, которая принимает два числа, складывает их и возвращает результат в двоичном формате. Результат должен быть строкой.
Пример:
1, 1 --> "10" (1 + 1 = 2 in decimal or 10 in binary)
5, 9 --> "1110" (5 + 9 = 14 in decimal or 1110 in binary)
Эффективная разработка на Spring Boot без ограничений.
Пока зарубежные компании отзывают лицензии у пользователей РФ, Amplicode продолжает помогать максимально удобно работать со Spring Boot, JPA, Docker, Kafka, Liquibase, MapStruct и т.д.
Amplicode можно установить как плагин в IntelliJ IDEA Community и Ultimate, а также в Giga IDE.
Что умеет Amplicode?
⚡ Легкая навигация по проекту
⚡ Создание объектов сразу в терминах фреймворка: контроллеры, репозитории, сервисы, сущности, события, DTO, мапперы и т.д.
⚡ Палитра и инспектор, позволяющие видеть опции, доступные разработчику в текущем контексте
⚡ Умные инжекции, подсказки и исправление ошибок
⚡ и многое другое!
А самое главное, Amplicode доступен бесплатно и без региональных ограничений!
Познакомьтесь со всеми возможностями Amplicode
Читайте наш гайд: «Как превратить IntelliJ IDEA Community Edition в Ultimate за 3 простых шага»
⁉️ Хотите, чтобы ваши Java-приложения выдерживали любые нагрузки и были стабильны в любой ситуации?
Научитесь этому на бесплатном открытом уроке с использованием Resilience4j!
В мире высоких нагрузок и распределенных систем стабильность — это ключ к успеху.
🗓 На уроке 19 декабря в 20:00 мск мы разберем фреймворк Resilience4j и покажем, как повысить отказоустойчивость ваших приложений.
🦾 Уверенные навыки работы с Resilience4j сделают вас востребованным специалистом, который способен справляться с реальными вызовами. Добавьте этот мощный инструмент в свой профессиональный стек.
Спикер Сергей Петрелевич — опытный разработчик на Java и Kotlin.
🔗 Регистрируйтесь на вебинар: https://otus.pw/CB1B/
Все участники вебинара получат скидку на курс «Java Developer. Professional».Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
Что такое метод finalize()
в Java, как он работает и почему его использование не рекомендуется?
Ответ ⬇️
Метод finalize() вызывается перед тем, как объект удаляется сборщиком мусора (garbage collector). Он используется для освобождения ресурсов, таких как файловые дескрипторы или сетевые соединения. Однако его использование не рекомендуется из-за непредсказуемости вызова (точное время выполнения сборки мусора неизвестно) и потенциальных проблем с производительностью. Вместо этого рекомендуется использовать try-with-resources или явно закрывать ресурсы.
Пример использования ⚙️
class Resource {Читать полностью…
@Override
protected void finalize() throws Throwable {
System.out.println("Ресурс освобожден!");
}
}
public class Main {
public static void main(String[] args) {
new Resource(); // Создаем объект без сохранения ссылки
System.gc(); // Явный вызов сборщика мусора (не гарантирует немедленного выполнения)
System.out.println("Завершение программы");
}
}
⚙️ String.contains()
В Java метод String.contains()
проверяет, содержится ли указанная подстрока в строке. Это удобный способ проверки наличия текста в строке.
#вопросы_с_собеседований
Расскажите про приведение типов. Что такое понижение и повышение типа?
Приведение типов — это преобразование переменной одного типа в другой.
Существует два вида приведения типов:
— Повышение типа (widening): автоматическое преобразование типа в другой, более широкий тип. Например, int в long. При этом не теряется точность, так как широкий тип может представить все значения узкого типа.
— Понижение типа (narrowing): явное приведение к более узкому типу, например double в int. Здесь возможна потеря точности, поэтому требуется явное приведение в коде.
Повышение типа безопасно, компилятор делает его автоматически.
Понижение опасно потерей данных, поэтому разработчик должен явно указать такое приведение в коде, чтобы показать, что он контролирует возможную потерю точности.
👩💻 Задача по Java: Проверка строки на наличие всех букв алфавита
Напишите функцию, которая проверяет, содержит ли строка все буквы английского алфавита (a-z). Игнорируйте регистр букв и символы, не являющиеся буквами.
Пример:
System.out.println(isPangram("The quick brown fox jumps over the lazy dog"));
// Ожидаемый результат: true
System.out.println(isPangram("Hello, World!"));
// Ожидаемый результат: false
Semaphore
Semaphore — это класс, который позволяет ограничивать количество потоков, одновременно работающих с каким-либо ресурсом.
Поток должен получить разрешение, чтобы войти в критическую секцию.Semaphore
управляет набором разрешений (permits), а конструктор принимает количество разрешений.
Если разрешений нет, поток ставится в очередь до освобождения.
Метод acquire()
получает разрешение, release()
— освобождает.
⌛ Что будет выведено при выполнении кода?
Пояснение ⬇️
Переменные sb1 и sb2 ссылаются на один и тот же объект StringBuilder. При вызове метода append изменения вносятся непосредственно в этот объект.Читать полностью…
• sb1.append(" World") добавляет " World" к строке, делая её "Hello World".
• Затем sb2.append("!") добавляет "!" к той же строке, получая "Hello World!".
Так как объект изменяется напрямую, при выводе обе переменные показывают результат "Hello World!".
⚙️ Objects.requireNonNull()
В Java метод Objects.requireNonNull()
проверяет, что объект не равен null
, и выбрасывает NullPointerException
, если проверка не пройдена. Это удобный способ защитить код от неожиданных null
.
👩💻 Задача по Java: Проверка баланса скобок в строке
Напишите функцию, которая проверяет, сбалансированы ли круглые, фигурные и квадратные скобки в заданной строке. Сбалансированность означает, что каждая открывающая скобка имеет соответствующую закрывающую, и скобки вложены корректно.
Пример:
"{[()()]}"
true
"{[(])}"
false
5 декабря пройдет онлайн-митап для java-разработчиков от Naumen. Спикеры поделятся опытом в промышленной java-разработке, реальными кейсами и полезными рекомендациями.
В программе три доклада:
🔸 Как приручить JSON — Максим Осипов, руководитель группы разработки Naumen SMP
🔸 Прагматика микросервисов: строим большую систему с помощью пачки монолитов — Дмитрий Черкасов, DevRel Jmix
🔸 Бэкэнд изображений в ОК — Руслан Измайлов, ведущий java-разработчик в ОК, VK
Старт митапа 5 декабря в 16:00 мск | 18:00 екб.
Участие как всегда бесплатное, нужна только регистрация.
→ Зарегистрироваться на митап.
Реклама, АО «Нау-сервис», ИНН 6671116364
https://www.naumen.ru/
erid: 2Vtzqx9U7pj
⚙️ Arrays.binarySearch()
В Java метод Arrays.binarySearch()
выполняет бинарный поиск в отсортированном массиве, возвращая индекс найденного элемента. Если элемент не найден, возвращается отрицательное значение, указывающее потенциальную позицию вставки.