JavaRocks
2.42K subscribers
95 photos
14 videos
189 links
Базовый канал для изучения языка Java.

Наш сайт: javarocks.ru

Все необходимые туториалы и материалы.

Тесты для проверки знаний. Лучшие практики и паттерны проектирования.
Download Telegram
⌨️ Лямбда-выражения и свой кастомный функциональный интерфейс

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

@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}

Функциональный интерфейс MathOperation содержит один абстрактный метод operate, который принимает два значения типа int и возвращает int. Аннотация @FunctionalInterface указывает на то, что интерфейс предназначен для использования в функциональном программировании и должен содержать только один абстрактный метод. Но аннотация не обязательна.

Использование лямбда-выражения:

public class LambdaExample {
public static void main(String[] args) {
// Реализация интерфейса с помощью лямбда-выражения
MathOperation addition = (a, b) -> a + b;
MathOperation subtraction = (a, b) -> a - b;
MathOperation multiplication = (a, b) -> a * b;
MathOperation division = (a, b) -> a / b;

int x = 10;
int y = 5;

System.out.println("Addition: " + operate(x, y, addition)); // 15
System.out.println("Subtraction: " + operate(x, y, subtraction)); // 5
System.out.println("Multiplication: " + operate(x, y, multiplication)); // 50
System.out.println("Division: " + operate(x, y, division)); // 2
}

// Метод, принимающий MathOperation и применяющий его к данным
private static int operate(int a, int b, MathOperation operation) {
return operation.operate(a, b);
}
}


В нашем примере лямбда-выражения используются для создания экземпляров интерфейса MathOperation для выполнения различных математических операций (сложение, вычитание и т.д.).

Метод operate принимает два целых числа и функциональный интерфейс MathOperation, затем выполняет переданную операцию. В метод в третьем параметре можно передать непосредственно лямбда-выражение, не используя промежуточную переменную.

🖥 Что такое ElasticSearch

Elasticsearch — открытая распределенная система управления данными и поиска по ним, основанная на поисковом движке Apache Lucene.

Он предоставляет мощные возможности по индексированию, хранению, поиску и анализу больших объемов информации в реальном времени.

. Она идеально подходит для приложений, требующих гибкости в поиске и высокой скорости обработки запросов. Благодаря интеграции с Kibana и Logstash, ElasticSearch становится мощным инструментом для мониторинга и анализа данных в реальном времени.

📌 Функции:

▪️ Мгновенный поиск по большим объемам данных
▪️ Гибкая схема индексации и поиска
▪️ Легкость в масштабировании и интеграции

👉 Java Rocks | #java #lambda #functionalinterface
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Когда и как использовать var, чтобы код стал понятнее?

Слышали про var? Его добавили в Java 10, чтобы облегчить нам жизнь. Но когда его лучше использовать, а когда стоит быть осторожнее?💡

Когда использовать var:

🔵 Когда всё понятно с контекста: Если тип переменной очевиден 👀, то зачем писать лишнее?

var list = new ArrayList<String>(); // Это список, и это сразу видно


🔵 Когда тип слишком громоздкий: Если объявление слишком длинное и перегружает код, var упрощает задачу:

var map = new HashMap<String, List<Integer>>(); // Чисто и просто


🔵 Короткие методы: В небольших методах с чёткой логикой, var помогает сделать код компактнее и читабельнее.

А вот где лучше избегать:

🔵 Если тип неочевиден: Когда сложно сразу понять, что это за переменная, лучше явно указать тип, чтобы не путать коллег.
var result = process(); // И что за процесс тут? 


Итог: var — отличный инструмент, но используйте его с умом. Вопрос к вам: а вы уже используете var в своих проектах? Если да, поделитесь опытом в комментариях! 👇

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤫 Некоторые популярные методы аутентификации

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

🔵 Аутентификация с помощью токенов:
Использует сгенерированные токены, такие как JSON Web Tokens (JWT), которые обмениваются между клиентом и сервером, обеспечивая повышенную безопасность без необходимости отправки учетных данных с каждым запросом.
Идеально подходит для более безопасных и масштабируемых систем.

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

🔵 Аутентификация с использованием API-ключей:
Назначает уникальные ключи пользователям или приложениям, которые отправляются в заголовках или параметрах; несмотря на простоту, может не обладать всеми преимуществами безопасности, как методы на основе токенов или OAuth.
Удобна для простого контроля доступа в менее чувствительных средах или для предоставления доступа к определённым функциям без необходимости предоставления разрешений, привязанных к конкретному пользователю.

💬 Какой метод аутентификации вы считаете наиболее эффективным с точки зрения обеспечения безопасности и удобства использования в ваших приложениях?

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
⌨️ Что такое класс Object? Какие в нем есть методы?

Object это базовый класс для всех остальных объектов в Java. Любой класс наследуется от Object и, соответственно, наследуют его методы:

public boolean equals(Object obj) – служит для сравнения объектов по значению;

int hashCode() – возвращает hash код для объекта;

String toString() – возвращает строковое представление объекта;

Class getClass() – возвращает класс объекта во время выполнения;

protected Object clone() – создает и возвращает копию объекта;

void notify() – возобновляет поток, ожидающий монитор;

void notifyAll() – возобновляет все потоки, ожидающие монитор;

void wait() – остановка вызвавшего метод потока до момента пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;

void wait(long timeout) – остановка вызвавшего метод потока на определённое время или пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;

void wait(long timeout, int nanos) – остановка вызвавшего метод потока на определённое время или пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;

protected void finalize() – может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.

👉 Java Rocks | #java #object #methods
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🎮 Cross-platform Game Development Framework

Это кроссплатформенная среда для разработки Java-игр на основе OpenGL, которая предоставляет надежную и проверенную временем платформу для быстрого прототипирования и создания игр.

▪️ Github

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Вам наверняка понравится этот инструмент, если работаете с JSON 👇

Вложенные JSON-файлы часто сложно читать.
𝐉𝐬𝐨𝐧𝐂𝐫𝐚𝐜𝐤 создает графические диаграммы из JSON-файлов и делает их легко читаемыми.
Кроме того, созданные диаграммы можно скачать в виде изображений.
Также поддерживает YAML и XML.

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
⌨️ Внутреннее устройство HashSet

Тут разработчики не стали мудрствовать лукаво и просто использовали экземпляр HashMap внутри HashSet. Каждый элемент HashSet хранится как ключ в этой хэш-таблице, а значение для каждого ключа установлено в фиксированное значение PRESENT, что является специальным объектом (обычно new Object()).

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

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

Упрощённый код класса HashSet:

public class HashSet<E> implements Set<E>, Cloneable, java.io.Serializable {
// Внутренний экземпляр HashMap
private transient HashMap<E, Object> map;

// Специальный константный объект, используемый в качестве значения для всех ключей
private static final Object PRESENT = new Object();

public HashSet() {
map = new HashMap<>();
}

public boolean add(E e) {
return map.put(e, PRESENT) == null;
}

public boolean remove(Object o) {
return map.remove(o) == null;
}

public boolean contains(Object o) {
return map.containsKey(o);
}

// Другие методы...
}


👉 Java Rocks | #java #hashset #hashmap
Please open Telegram to view this post
VIEW IN TELEGRAM
🔼 Топ-5 способов улучшить производительность API:

1️⃣ Пагинация результатов:
Этот метод используется для оптимизации больших наборов данных путем их постраничной передачи клиенту, что повышает отзывчивость сервиса и улучшает пользовательский опыт.

2️⃣ Асинхронное логирование:
Этот подход предполагает отправку логов в буфер без блокировки и немедленное возвращение управления, вместо того чтобы записывать данные на диск при каждом вызове. Логи периодически сбрасываются на диск, что значительно снижает нагрузку на систему ввода-вывода.

3️⃣ Кэширование данных:
Часто запрашиваемые данные могут храниться в кэше для ускорения их извлечения. Клиенты сначала проверяют кэш перед обращением к базе данных, а такие решения для хранения данных, как Redis, обеспечивают более быстрый доступ благодаря хранению в оперативной памяти.

4️⃣ Сжатие payload:
Чтобы сократить время передачи данных, запросы и ответы можно сжимать, что ускоряет процессы загрузки и выгрузки.

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

💬 А как вы улучшаете перфоманс API?

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Что такое ACID?

🔹 Атомарность (Atomicity)
Гарантирует, что транзакция не будет зафиксирована частично. Все записи в транзакции выполняются одновременно и не могут быть разбиты на меньшие части. Если при выполнении транзакции возникают ошибки, все записи откатываются.

🔹 Согласованность (Consistency)
Любые данные, записанные в ходе транзакции, должны быть валидны в соответствии со всеми определёнными правилами и поддерживать базу данных в корректном состоянии.

🔹 Изоляция (Isolation)
Параллельные транзакции не должны оказывать влияния друг на друга. Изолированность сложно достижима, поэтому существуют различные уровни изоляции.

🔹 Надежность (Durability)
Данные сохраняются после завершения транзакции, даже в случае сбоя системы.

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
⌨️ Несколько способов для избежания NullPointerException:

✔️ Используйте Optional из пакета java.util.

✔️ При сравнении константы с переменной пришедшей из вне, нужно вызывать equals() на константе.

✔️ А при сравнении двух переменных используйте java.util.Objects#equals.

✔️ Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.

✔️ Вызывайте методы equals() и equalsIgnoreCase() на известных объектах.

✔️ Применяйте valueOf() вместо toString().

✔️ Воспользуйтесь аннотациями @NotNull и @Nullable на основе IDE.

✔️ При возврате из метода коллекций, не стоит возвращать null, лучше пустую коллекцию (java.util.Collections#emptyList).

👉 Java Rocks | #java #NullPointerException #Optional
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🚫 Ключевые проблемы многопоточности

🔵 Состояние гонки (Race Conditions):

Ситуация, когда несколько потоков пытаются одновременно читать и записывать общие данные, что приводит к непредсказуемым результатам.
Пример: Представьте, что два человека пытаются одновременно снять деньги с одного банковского счета. Без должной координации они могут снять больше денег, чем доступно на счете.

🔵 Взаимные блокировки (Deadlocks):

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

🔵 Ошибки конкуренции (Concurrency Bugs):

Ошибки, возникающие из-за неправильной обработки взаимодействия потоков, часто проявляющиеся как случайные проблемы.
Пример: Если два работника пишут в один и тот же файл без координации, их работа может перемешаться.

🔵 Прерывание потока (Thread Interruption):

Основная проблема заключается в том, что сигнал на прерывание лишь уведомляет поток о необходимости остановки, но сам поток должен обработать этот сигнал и завершить свою работу самостоятельно.
Пример: Если вам нужно, чтобы рабочий остановился, вы посылаете ему сигнал "стоп". Но нет гарантий, что это случится.

🔵 Ошибки согласованности памяти (Memory Consistency Errors):

Ситуация, когда разные потоки имеют устаревшее или несогласованное представление о разделяемой памяти.
Пример: Если один человек обновляет общий документ, а другие видят старую версию, они могут работать с неверной информацией.

🔵 Соперничество за ресурсы (Resource Contention):

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

🔵 Голодание (Starvation):

Ситуация, когда потоку постоянно отказывают в доступе к ресурсам из-за приоритета других потоков.
Пример: Если одного работника постоянно обходят вниманием в пользу других, он никогда не сможет выполнить свою работу.

👉 Java Rocks | #java
Please open Telegram to view this post
VIEW IN TELEGRAM
От Java к Kotlin

Авторы:
Дункан Макгрегор, Нэт Прай
Год издания: 2023

#java #kotlin #ru #книга

Скачать книгу
👍61
Вакансии по Java за последнюю неделю:

Backend Java Developer. Удалённо, от 140 т.р.

Java разработчик. Новосибирск (гибрид), з/п по договорённости.

QA Automation (Java) Middle/Senior. Удалённо (РФ), 240-250 т.р.

Senior Java Developer. Удалённо (Беларусь)/офис (Гомель), 2700-3000 USD (на руки).

QA SDET (Java). Удалённо/офис, до 6500$.

#подборка #java
Вакансии по Java за последнюю неделю:

Senior Java Developer. Удалённо (Беларусь)/офис (Гомель), 2700-3000 USD (на руки).

QA SDET (Java). Удалённо/офис, до 6500$.

Java/Kotlin разработчик. Удалённо (РФ, дружественные страны), до 370 т.р. на руки.

Java Developer (Web3). Удалённо, 5400-6700 USD.

Senior Software Engineer (Java). Удалённо (не из РФ), 4000–6000$ gross.

Автотестировщик Java. Удалённо (РФ), з/п не указана.

QA Full-stack (Java/Mobile). Удалённо (РФ), 250 000 – 330 000₽.

AQA Java. Удалённо, 70 000 – 100 000₽. Стажировка (после – полная занятость).

Full Stack Developer (Java/Javascript). Удалённо (не из РФ), 4500–5000$ gross.

QA Full-stack (Java). Удалённо/офис (Москва), до 280 000₽ gross.

#подборка #java
💊4
Топ книг по Java на русском языке
Скачивайте и читайте.

Java. Полное руководство
Автор: Герберт Шилдт

Java. Библиотека профессионала
Автор: Кей Хорстманн

Java. Эффективное программирование
Автор: Джошуа Блох

Spring в действии
Автор: Крейг Уоллс

Java Concurrency на практике
Авторы: Брайан Гетц

Алгоритмы на Java
Авторы: Роберт Седжвик

#ru #java #подборка

Предлагайте книги в комментариях — добавим их в список! 📚
👍2
Вакансии по Java за последние 14 дней:

Java разработчик. Удалённо, 260-300 т.р. гросс.

QA Automation Engineer (Java+Selenium) Middle. Удалённо (нахлёст на США), 100–200 т.р.

Автотестировщик Middle. Удалённо (РФ), 10 000 – 14 000 руб/дн по ИП/СЗ.

Java разработчик. Удалённо (РФ), 300–320 т.р..

Software Engineer (Java). Удалённо (не из РФ), 4000 – 6000$ gross.

Senior Java разработчик. Удалённо (РФ), 260–300 т.р. gross.

Fullstack QA JAVA Middle. Удалённо (РФ), от 250 до 390 т.р. gross.

Java разработчик (Middle+). Удалённо (РФ и дружественные страны), 350–370 т.р. на руки.

Middle Java Developer. Удалённо (только РФ или РБ), от 250 т.р. gross.

Senior Full Stack Developer (Java / Javascript). Удалённо (не из РФ), 4500 – 5500$ gross.

#подборка #java
Вакансии для Java-разработчиков за последние 14 дней:

Java Developer (Junior). Удалённо (РФ), 100–150 т.р.

Junior Java Developer. Удалённо

QA Automation Engineer (Java). Удалённо, 280–300 т.р.

Java разработчик. Удалённо (РФ), 270–320 т.р.

Java разработчик. Удалённо, 320–360 т.р. гросс

QA full stack (Java). Удалённо, 315–350 т.р. гросс

Full Stack Developer (Java / Javascript). Удалённо (не из РФ), 6000–7500 $ gross

Software Engineer Java. Удалённо, 5000–6500 $ gross

Senior Java Developer. Сербия / гибрид или удалёнка, до 6000 EUR

Java разработчик. Удалённо, от 7500$ gross

#подборка #java
1
Вакансии для Java-разработчиков за последние 14 дней:

Fullstack QA (Java). Офис (Сербия), Natera

QA Auto Java. Офис (Казань), 170 т.р.

Java-разработчик Middle. Удалённо, PlaysDev, 180–200 т.р.

QA Full stack (JAVA). Удалённо (РФ), Selecty, 200–290 т.р.

QA Full stack (Java). Удалённо (РФ), 250–408 т.р.

Java-разработчик. Удалённо (РФ), JETLYN, 260–350 т.р.

Инженер по авто тестированию (Java). Удалённо (РФ), Bell Integrator, 280 т.р.

Java Developer. Удалённо, Top Selection, до 310 т.р.

QA full stack JAVA. Удалённо (РФ), Selecty (КА), 315–350 т.р.

Full Stack Developer (Java / Javascript). Удалённо (Мир), 600–750 т.р.

#подборка #java
👍2
Вакансии для Java-разработчиков за последние 14 дней:

Junior / Middle Android Developer Удалённо (Беларусь)

Senior Backend Developer (Java, Kotlin, Meta API) Удалённо, 4500–5500$ net

Java разработчик Удалённо, 310–390 т.р.

Java разработчик Удалённо, от 5000 до 12000 $

QA Auto Java Удалённо (РФ), 230–320 т.р.

Fullstack QA Java Удалённо (РФ), от 250 до 390 т.р.

Java разработчик Удалённо (РФ), 300–320 т.р.

QA Fullstack (JAVA) Удалённо (РФ), от 250 до 380 т.р.

Fullstack QA Engineer (Java) Удалённо/гибрид (РФ), от 300 до 360 т.р.

Lead Java Удалённо/гибрид, от 6500$

Fullstack QA JAVA Удалённо (РФ), от 250 до 408 т.р.

#подборка #java
1
Вакансии для Java-разработчиков за последние 14 дней:

QA Fullstack на JAVA (web+mobile) Удалённо (РФ), от 280 до 320 т.р.

AQA Middle+ Java Удалённо (РФ), от 250 т.р.

Middle Java разработчик Удалённо (РФ), от 320 т.р.

QA Engineer Удалённо (РФ), от 200 т.р.

Java developer Удалённо (РФ), от 280 до 340 т.р.

QA Auto Java Удалённо (РФ), от 220 до 330 т.р.

QA Full-Stack Java Удалённо, до 240 т.р.

Java разработчик Удалённо (РФ), от 240 до 270 т.р.

Fullstack QA JAVA Удалённо (РФ), от 250 до 390 т.р.

Java-разработчик Удалённо (Мир), от 350 до 370 т.р.

QA Full-stack Java Удалённо (РФ), от 250 до 350 т.р.

#подборка #java