Please open Telegram to view this post
VIEW IN TELEGRAM
Лямбда-выражения на первый взгляд могут показаться чем-то сложным и загадочным, но на самом деле они просты и интуитивно понятны.
Лямбда-выражение — это лаконичный способ описания анонимной функции, которую можно передать в качестве параметра или сохранить в переменной для последующего использования.
Если говорить ещё проще, лямбда-выражение — это просто другой способ создания и реализации объекта определённого типа. Рассмотрим это на примере создания нового потока.
У класса
Thread
есть конструктор:
public Thread(Runnable target) {
...
}
То есть в конструктор нужно передать объект типа
Runnable
. До лямбда-выражений мы сделали бы так:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World");
}
}).start();
Здесь мы создаём анонимный класс, реализующий интерфейс
Runnable
, с определённым методом run
.Если использовать лямбда-выражение, тот же код будет выглядеть следующим образом:
Runnable r = () -> System.out.println("Hello World");
new Thread(r).start();
Или проще:
new Thread(() -> System.out.println("Hello World")).start();
Лямбда-выражение заменяет собой анонимный класс, который раньше был бы необходим для реализации
Runnable
. Лямбда-выражение может использоваться только там, где ожидается реализация функционального интерфейса — интерфейса с единственным абстрактным методом. А интерфейс
Runnable
именно такой:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Функциональный интерфейс должен содержать только один абстрактный метод, чтобы компилятор мог точно определить, какой метод реализует лямбда-выражение. В противном случае возникли бы неоднозначности и ошибки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Elasticsearch — открытая распределенная система управления данными и поиска по ним, основанная на поисковом движке Apache Lucene.
Он предоставляет мощные возможности по индексированию, хранению, поиску и анализу больших объемов информации в реальном времени.
. Она идеально подходит для приложений, требующих гибкости в поиске и высокой скорости обработки запросов. Благодаря интеграции с Kibana и Logstash, ElasticSearch становится мощным инструментом для мониторинга и анализа данных в реальном времени.
▪️ Мгновенный поиск по большим объемам данных
▪️ Гибкая схема индексации и поиска
▪️ Легкость в масштабировании и интеграции
Please open Telegram to view this post
VIEW IN 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 — открытая распределенная система управления данными и поиска по ним, основанная на поисковом движке Apache Lucene.
Он предоставляет мощные возможности по индексированию, хранению, поиску и анализу больших объемов информации в реальном времени.
. Она идеально подходит для приложений, требующих гибкости в поиске и высокой скорости обработки запросов. Благодаря интеграции с Kibana и Logstash, ElasticSearch становится мощным инструментом для мониторинга и анализа данных в реальном времени.
▪️ Мгновенный поиск по большим объемам данных
▪️ Гибкая схема индексации и поиска
▪️ Легкость в масштабировании и интеграции
Please open Telegram to view this post
VIEW IN TELEGRAM
Слышали про var? Его добавили в Java 10, чтобы облегчить нам жизнь. Но когда его лучше использовать, а когда стоит быть осторожнее?💡
Когда использовать var:
var list = new ArrayList<String>(); // Это список, и это сразу видно
var map = new HashMap<String, List<Integer>>(); // Чисто и просто
А вот где лучше избегать:
var result = process(); // И что за процесс тут?
Итог: var — отличный инструмент, но используйте его с умом. Вопрос к вам: а вы уже используете var в своих проектах? Если да, поделитесь опытом в комментариях! 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Предполагает отправку имени пользователя и пароля с каждым запросом, но может быть менее безопасной без шифрования.
Подходит для простых приложений, где безопасность и шифрование не являются приоритетом, или при использовании защищенных соединений.
Использует сгенерированные токены, такие как JSON Web Tokens (JWT), которые обмениваются между клиентом и сервером, обеспечивая повышенную безопасность без необходимости отправки учетных данных с каждым запросом.
Идеально подходит для более безопасных и масштабируемых систем.
Позволяет сторонним приложениям получать ограниченный доступ к ресурсам пользователя без раскрытия учетных данных, выдавая токены доступа после аутентификации пользователя.
Подходит для ситуаций, требующих контролируемого доступа к ресурсам пользователя сторонними приложениями или сервисами.
Назначает уникальные ключи пользователям или приложениям, которые отправляются в заголовках или параметрах; несмотря на простоту, может не обладать всеми преимуществами безопасности, как методы на основе токенов или OAuth.
Удобна для простого контроля доступа в менее чувствительных средах или для предоставления доступа к определённым функциям без необходимости предоставления разрешений, привязанных к конкретному пользователю.
Please open Telegram to view this post
VIEW IN TELEGRAM
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()
– может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.Please open Telegram to view this post
VIEW IN TELEGRAM
🎮 Cross-platform Game Development Framework
Это кроссплатформенная среда для разработки Java-игр на основе OpenGL, которая предоставляет надежную и проверенную временем платформу для быстрого прототипирования и создания игр.
▪️ Github
👉 Java Rocks | #java
Это кроссплатформенная среда для разработки Java-игр на основе OpenGL, которая предоставляет надежную и проверенную временем платформу для быстрого прототипирования и создания игр.
▪️ Github
Please open Telegram to view this post
VIEW IN TELEGRAM
Вам наверняка понравится этот инструмент, если работаете с JSON 👇
Вложенные JSON-файлы часто сложно читать.
𝐉𝐬𝐨𝐧𝐂𝐫𝐚𝐜𝐤 создает графические диаграммы из JSON-файлов и делает их легко читаемыми.
Кроме того, созданные диаграммы можно скачать в виде изображений.
Также поддерживает YAML и XML.
👉 Java Rocks | #java
Вложенные JSON-файлы часто сложно читать.
𝐉𝐬𝐨𝐧𝐂𝐫𝐚𝐜𝐤 создает графические диаграммы из JSON-файлов и делает их легко читаемыми.
Кроме того, созданные диаграммы можно скачать в виде изображений.
Также поддерживает YAML и XML.
Please open Telegram to view this post
VIEW IN TELEGRAM
Тут разработчики не стали мудрствовать лукаво и просто использовали экземпляр
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);
}
// Другие методы...
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Этот метод используется для оптимизации больших наборов данных путем их постраничной передачи клиенту, что повышает отзывчивость сервиса и улучшает пользовательский опыт.
Этот подход предполагает отправку логов в буфер без блокировки и немедленное возвращение управления, вместо того чтобы записывать данные на диск при каждом вызове. Логи периодически сбрасываются на диск, что значительно снижает нагрузку на систему ввода-вывода.
Часто запрашиваемые данные могут храниться в кэше для ускорения их извлечения. Клиенты сначала проверяют кэш перед обращением к базе данных, а такие решения для хранения данных, как Redis, обеспечивают более быстрый доступ благодаря хранению в оперативной памяти.
Чтобы сократить время передачи данных, запросы и ответы можно сжимать, что ускоряет процессы загрузки и выгрузки.
Эта техника включает использование пула открытых соединений для управления взаимодействием с базой данных, что снижает накладные расходы, связанные с открытием и закрытием соединений каждый раз, когда требуется загрузить данные. Пул управляет жизненным циклом соединений для эффективного использования ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 Атомарность (Atomicity)
Гарантирует, что транзакция не будет зафиксирована частично. Все записи в транзакции выполняются одновременно и не могут быть разбиты на меньшие части. Если при выполнении транзакции возникают ошибки, все записи откатываются.
🔹 Согласованность (Consistency)
Любые данные, записанные в ходе транзакции, должны быть валидны в соответствии со всеми определёнными правилами и поддерживать базу данных в корректном состоянии.
🔹 Изоляция (Isolation)
Параллельные транзакции не должны оказывать влияния друг на друга. Изолированность сложно достижима, поэтому существуют различные уровни изоляции.
🔹 Надежность (Durability)
Данные сохраняются после завершения транзакции, даже в случае сбоя системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
✔️ Используйте
Optional
из пакета java.util
.✔️ При сравнении константы с переменной пришедшей из вне, нужно вызывать
equals()
на константе.✔️ А при сравнении двух переменных используйте
java.util.Objects#equals
.✔️ Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.
✔️ Вызывайте методы
equals()
и equalsIgnoreCase()
на известных объектах.✔️ Применяйте
valueOf()
вместо toString()
.✔️ Воспользуйтесь аннотациями
@NotNull
и @Nullable
на основе IDE.✔️ При возврате из метода коллекций, не стоит возвращать
null
, лучше пустую коллекцию (java.util.Collections#emptyList
).Please open Telegram to view this post
VIEW IN TELEGRAM
Ситуация, когда несколько потоков пытаются одновременно читать и записывать общие данные, что приводит к непредсказуемым результатам.
Пример: Представьте, что два человека пытаются одновременно снять деньги с одного банковского счета. Без должной координации они могут снять больше денег, чем доступно на счете.
Ситуация, когда два или более потока застревают в ожидании друг друга для освобождения ресурсов, что приводит к тупиковой ситуации.
Пример: Два человека держат предметы, которые нужны друг другу, и оба ждут, пока другой первый отдаст свой предмет.
Ошибки, возникающие из-за неправильной обработки взаимодействия потоков, часто проявляющиеся как случайные проблемы.
Пример: Если два работника пишут в один и тот же файл без координации, их работа может перемешаться.
Основная проблема заключается в том, что сигнал на прерывание лишь уведомляет поток о необходимости остановки, но сам поток должен обработать этот сигнал и завершить свою работу самостоятельно.
Пример: Если вам нужно, чтобы рабочий остановился, вы посылаете ему сигнал "стоп". Но нет гарантий, что это случится.
Ситуация, когда разные потоки имеют устаревшее или несогласованное представление о разделяемой памяти.
Пример: Если один человек обновляет общий документ, а другие видят старую версию, они могут работать с неверной информацией.
Ситуация, когда несколько потоков конкурируют за один и тот же ограниченный ресурс, что приводит к задержкам.
Пример: Если несколько работников одновременно пытаются воспользоваться одним принтером, им приходится ждать своей очереди.
Ситуация, когда потоку постоянно отказывают в доступе к ресурсам из-за приоритета других потоков.
Пример: Если одного работника постоянно обходят вниманием в пользу других, он никогда не сможет выполнить свою работу.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вакансии по Java за последнюю неделю:
✓ Backend Java Developer. Удалённо, от 140 т.р.
✓ Java разработчик. Новосибирск (гибрид), з/п по договорённости.
✓ QA Automation (Java) Middle/Senior. Удалённо (РФ), 240-250 т.р.
✓ Senior Java Developer. Удалённо (Беларусь)/офис (Гомель), 2700-3000 USD (на руки).
✓ QA SDET (Java). Удалённо/офис, до 6500$.
#подборка #java
✓ Backend Java Developer. Удалённо, от 140 т.р.
✓ Java разработчик. Новосибирск (гибрид), з/п по договорённости.
✓ QA Automation (Java) Middle/Senior. Удалённо (РФ), 240-250 т.р.
✓ Senior Java Developer. Удалённо (Беларусь)/офис (Гомель), 2700-3000 USD (на руки).
✓ QA SDET (Java). Удалённо/офис, до 6500$.
#подборка #java
Telegram
Java Вакансии
Backend Java Developer
Формат: Удалённо
Зарплата: от 140 т.р.
Полная занятость
Описание: https://telegra.ph/Backend-Java-Developer-04-06
#remote #fulltime
Связаться с HR - @nineseven
Формат: Удалённо
Зарплата: от 140 т.р.
Полная занятость
Описание: https://telegra.ph/Backend-Java-Developer-04-06
#remote #fulltime
Связаться с HR - @nineseven
Вакансии по 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
✓ 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
Топ книг по Java на русском языке
Скачивайте и читайте.
Java. Полное руководство
Автор: Герберт Шилдт
Java. Библиотека профессионала
Автор: Кей Хорстманн
Java. Эффективное программирование
Автор: Джошуа Блох
Spring в действии
Автор: Крейг Уоллс
Java Concurrency на практике
Авторы: Брайан Гетц
Алгоритмы на Java
Авторы: Роберт Седжвик
#ru #java #подборка
Предлагайте книги в комментариях — добавим их в список! 📚
Скачивайте и читайте.
Java. Полное руководство
Автор: Герберт Шилдт
Java. Библиотека профессионала
Автор: Кей Хорстманн
Java. Эффективное программирование
Автор: Джошуа Блох
Spring в действии
Автор: Крейг Уоллс
Java Concurrency на практике
Авторы: Брайан Гетц
Алгоритмы на Java
Авторы: Роберт Седжвик
#ru #java #подборка
Предлагайте книги в комментариях — добавим их в список! 📚
Вакансии по 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 разработчик. Удалённо, 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
✓ 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