Telegram Web Link
🖥Deque или Stack в Java — что выбрать?

Deque отличается гибкостью и производительностью, превосходя тем самым Stack. Являясь частью Java Collections Framework, Deque предлагает как механизмы работы LIFO (стек), так и FIFO (очередь), предоставляя разнообразные высокопроизводительные реализации, например ArrayDeque, что выделяет его на фоне устаревшего и предназначенного для однопоточности класса Stack.

ArrayDeque можно использовать в качестве стека:
Deque<Integer> stack = new ArrayDeque<>();

stack.push(1); // добавить элемент — easy
int top = stack.peek(); // Взять верхний элемент легко
int pop = stack.pop(); // ...как и нижний


Короче, выбирайте Deque для надежной и эффективной реализации стека

📎 Более подробную инфу про Deque можно найти тут

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Ключевые различия между Kotlin и Java 🖥

Полезно понимать ограничения и достоинства инструмента, так что держите:

Kotlin сочетает в себе функции как объектно-ориентированного, так и функционального программирования, тогда как Java ограничивается объектно-ориентированным программированием.

Kotlin позволяет пользователям создавать функции расширения, тогда как Java не предлагает никаких функций расширения.

Kotlin не предлагает неявных преобразований, а Java поддерживает неявные преобразования.

В Котлине нет нулевых переменных или объектов; с другой стороны, переменные или объекты Null являются частью языка Java.

Kotlin не поддерживает статические члены, а Java использует статические члены.

В Kotlin переменные примитивного типа являются объектами, а в Java переменные примитивного типа не являются объектами.

Kotlin поддерживает лямбда-выражения, тогда как Java не поддерживает лямбда-выражения (Лямбда-выражения добавлены в Java 8)

Kotlin не требует каких-либо спецификаций переменных типов данных, тогда как Java требует спецификаций переменных типов данных.

Kotlin не требует каких-либо спецификаций переменных типов данных, но Java требует спецификаций переменных типов данных.

Программы Kotlin не требуют точек с запятой в своей программе, в то время как программа Java требует точку с запятой.

Возможности языковых сценариев позволяют использовать Kotlin непосредственно в сценариях сборки Gradle, тогда как Java не предлагает возможностей языковых сценариев.

@android_its
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 JUnit 5 FormattedSource

Библиотека, которая позволяет вам писать параметризованные тесты #JUnit5 простым и понятным способом.

Просто укажите формат и используйте его для определения ваших тестовых примеров 👇

Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Что такое Null Pointer Exception и как его исправить?

▶️Что из себя представляет исключение java.lang.NullPointerException и почему оно может происходить?
Какие методы и средства использовать, чтобы определить причину возникновения этого исключения, приводящего к преждевременному прекращению работы приложения?


Ответ и решение

Когда вы объявляете переменную ссылочного типа, на самом деле вы создаете ссылку на объект данного типа. Рассмотрим следующий код для объявления переменной типа int:
int x;
x = 10;

В этом примере переменная x имеет тип int и Java инициализирует её как 0. Когда вы присвоите переменной значение 10 (вторая строка), это значение сохранится в ячейке памяти, на которую ссылается x.

Но когда вы объявляете ссылочный тип, процесс выглядит иначе. Посмотрим на следующий код:
Integer num;
num = new Integer(10);

В первой строке объявлена переменная num, ее тип не относится к встроенному, следовательно, значением является ссылка (тип этой переменной, Integer, является ссылочным типом). Поскольку вы еще не указали, на что собираетесь ссылаться, Java присвоит переменной значение Null, подразумевая «Я ни на что не ссылаюсь».

Во второй строке, ключевое слово new используется для создания объекта типа Integer. Этот объект имеет адрес в памяти, который присваивается переменной num. Теперь, с помощью переменной num вы можете обратиться к объекту используя оператора разыменования ..

Исключение java.lang.NullPointerException возникает, если вы объявили переменную, но не создали объект, то есть если вы попытаетесь разыменовать num до того, как создали объект, вы получите NullPointerException. В самом простом случае, компилятор обнаружит проблему и сообщит, что
num may not have been initialized
Что говорит: «возможно, переменная num не инициализирована».

Иногда исключение вызвано именно тем, что объект действительно не был создан. К примеру, у вас может быть следующая функция:
public void doSomething(Integer num){
// Работаем с num
}

В этом случае создание объекта (переменная num) лежит на вызывающем коде, то есть вы предполагаете, что он был создан ранее – до вызова метода doSomething. К сожалению, следующий вызов метода вполне возможен:
doSomething(null);

В этом случае значение переменной num будет null. Лучшим способом избежать данного исключения будет проверка на равенство нулю. Как результат, функция doSomething должна быть переписана следующим образом:
public void doSomething(Integer num){
if (num != null) {
// Работаем с num
}
}


Как альтернативный вариант предыдущему примеру вы можете сообщить вызывающему коду, что метод был вызван с неверными параметрами, например, с помощью IllegalArgumentException.
public void doSomething(Integer num){
if (num == null)
throw new IllegalArgumentException("Num не должен быть null");
// Работаем с num
}


@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Синтаксис и применение метода substring() в Java

Повторение — мать учения и основа научного метода, так что приступим)

В Java подстрока (substring) относится к непрерывной последовательности символов внутри данной строки. Она позволяет извлекать сегменты текстовых данных на основе начальных и конечных индексов.

🔜 Синтаксис метода substring()
Метод substring() используется для извлечения подстрок из заданной строки в Java. Он поставляется в 2 версиях:

substring(int BeginIndex) — этот метод извлекает символы из указанного значения BeginIndex до конца строки.

substring(int BeginIndex, int EndIndex) — этот метод извлекает символы от BeginIndex до (но не включая) EndIndex.


🔜 Пример использования substring()
public class SubstringExample {
public static void main(String[] args) {
String originalString = "Java is amazing!";

// Извлекаем подстроку от индекса 5 до конца
String substring1 = originalString.substring(5);
System.out.println("Substring 1: " + substring1);

// Извлекаем подстроку с индексом от 0 до 4 (исключая)
String substring2 = originalString.substring(0, 4);
System.out.println("Substring 2: " + substring2);
}
}

substring1 начинается с индекса 5 ("i") и до конца строки, в результате чего получается "is amazing!"
substring2, начиная с индекса 0 ("J") до (но не включая) индекс 4 ("a"), в результате чего получается "Java"


🔜 Рекомендации по использованию метода substring()

Обеспечьте правильную проверку входных индексов, чтобы избежать исключения IndexOutOfBoundsException.

Грамотно обрабатывайте исключительные случаи (edge cases), такие как пустые строки или недопустимые диапазоны индексов.

Используйте подстроку в сочетании с другими методами манипулирования строками для сложных операций.

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

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Итерация по диапазону дат в Java

7️⃣Начиная с Java 7, мы будем использовать класс java.util.Date для хранения значений дат и java.util.Calendar для увеличения от одной даты к другой.

Давайте рассмотрим пример использования простого цикла while вместе с классами java.util.Date и java.util.Calendar :
void iterateBetweenDatesJava7(Date start, Date end) {
Date current = start;

while (current.before(end)) {
processDate(current);

Calendar calendar = Calendar.getInstance();
calendar.setTime(current);
calendar.add(Calendar.DATE, 1);
current = calendar.getTime();
}
}



8️⃣Начиная с Java 8, мы можем использовать новый Java 8 Date API. Это дает нам самообрабатываемые, неизменяемые, плавные и потокобезопасные объекты. Это также позволяет нам писать более чистый код без необходимости использования вспомогательного класса, такого как java.util.Calendar, для увеличения дат.

Давайте воспользуемся LocalDate и методом plusDays(1) для перемещения вперед по диапазону дат:
void iterateBetweenDatesJava8(LocalDate start, LocalDate end) {
for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {
processDate(date);
}
}

Здесь стоит отметить, что хотя Stream API доступен, начиная с Java 8, итерация между двумя датами с использованием Date API в сочетании с Stream API невозможна до Java 9.


9️⃣Java 9 представляет метод dateUntil, который позволяет нам использовать Stream API для итерации от даты начала до даты окончания.

Давайте обновим код нашего примера, чтобы воспользоваться этой функцией:
void iterateBetweenDatesJava9(LocalDate start, LocalDate end) {
start.datesUntil(end).forEach(this::processDate);
}


🖥 Фрагменты кода на GitHub

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Java. Лучшие бесплатные курсы для изучения

Лучшие бесплатные курсы, книги ,онлайн-платформы и репозитории предлагают широкий спектр обучающих материалов, которые помогут начинающим программистам освоить Java и применять знания на практике.

Видео
Список

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Реализация бесконечности в Java: все числовые типы данных

Для обозначения бесконечности в Java используйте константы Double.POSITIVE_INFINITY для положительной бесконечности и Double.NEGATIVE_INFINITY для отрицательной:
double posInf = Double.POSITIVE_INFINITY; // +∞
double negInf = Double.NEGATIVE_INFINITY; // -∞


Еще один подход – получить бесконечность путем деления на ноль:
double posInfCalc = 1.0 / 0.0; // +∞
double negInfCalc = -1.0 / 0.0; // -∞

Внимание: в случае целочисленного деления на ноль возникает исключение ArithmeticException, поэтому для операций с бесконечностями используйте типы float или double.


Обработка бесконечностей в Java основывается на стандарте IEEE 754 и следует правилам:
🔘Сложение: Double.POSITIVE_INFINITY + anyPositiveDouble всегда будет равно Double.POSITIVE_INFINITY.
🔘Вычитание: Разность между двумя одинаковыми бесконечностями будет NaN (не число).
🔘Умножение: Умножение Double.POSITIVE_INFINITY на отрицательное число приводит к Double.NEGATIVE_INFINITY и наоборот.
🔘Деление: Деление любого числа на Double.POSITIVE_INFINITY даст ноль.

В зависимости от специфики задачи и требуемой точности можно использовать типы Double или Float.

При проведении операций сравнения с бесконечностями учтите:
🔘Double.POSITIVE_INFINITY всегда больше любого конечного значения, в то время как Double.NEGATIVE_INFINITY всегда меньше.
🔘Проверку на равенство с NaN лучше производить с помощью Double.isNaN(), так как любое равенство с NaN возвращает false.
🔘Double.POSITIVE_INFINITY равно Double.POSITIVE_INFINITY, что также верно и для отрицательной бесконечности.

Бесконечность может быть полезной в алгоритмах, где она обозначает недостижимый предел, либо в оптимизационных алгоритмах, где она может быть использована как начальное значение для минимизации стоимости.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Немного о конструкции when в Kotlin

Конструкция when проверяет значение некоторого объекта и в зависимости от его значения выполняет тот или иной код. Конструкция when аналогична конструкции switch в других языках. Формальное определение:

значение1 -> действия1
значение2 -> действия2
...
значениеN -> действияN
}


Если значение объекта равно одному из значений в блоке кода when, то выполняются соответствующие действия, которые идут после оператора -> после соответствующего значения:

fun main() {
val isEnabled = true
when(isEnabled){
false -> println("isEnabled off")
true -> println("isEnabled on")
}
}

Здесь в качестве объекта в конструкцию when передается переменная isEnabled. Далее ее значение по порядку сравнивается со значениями в false и true. В данном случае переменная isEnabled равна true, поэтому будет выполняться код:
println("isEnabled on")



Выражение else

В примере выше isEnabled имела только 2 возможных варианта: true и false. Однако чаще бывают случаи, когда значения в блоке when не покрывают все возможные значения объекта. Дополнительное выражение else позволяет задать действия, которые выполняются, если объект не соответствует ни одному из значений:

val a = 30
when(a){
10 -> println("a = 10")
20 -> println("a = 20")
else -> println("неопределенное значение")
}

То есть в данном случае если переменная a равна 30, поэтому она не соответствует ни одному из значений в блоке when. И соответственно будут выполняться инструкции из выражения else.

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

var a = 10
when(a){
10 -> {
println("a = 10")
a *= 2
}
20 -> {
println("a = 20")
a *= 5
}
else -> { println("неопределенное значение")}
}
println(a)


📎 Читать подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Отличная статья-презентация о работе с шаблонизаторами Kotlin

В статье рассматривается использование шаблонизатора Pebble для формирования HTML-документов и его особенности, включая поддержку фильтров, тегов и наследования шаблонов.

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

Обсуждаются принципы работы с шаблонами и передача списков данных в шаблоны.

Параллельно рассматриваются различные аспекты разработки приложений на Kotlin, включая императивный, объектно-ориентированный и функциональный синтаксис; рассматривается работа с функциями в Kotlin и их объектная природа.

Кроме этого обсуждается вопрос null-безопасности в Kotlin и удобные средства для обработки этой ситуации.

📎 Онлайн-презентация

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
📌Мастер-класс: рекомендательная система музыки на Java

При помощи открытого датасета в этом видео с нуля создаётся рекомендательная система музыки; разбирается, какие из наивных решений могут не сработать в реальных системах.
На примере технологий Одноклассников спикер рассказывает, как решаются ML-задачи в гетерогенных продакшенах, где необходимо использовать вместе Java и Python.

Мастер-класс будет интересен разработчикам, которым интересна тема машинного обучения, но они либо еще не погружались в нее, либо сделали самые первые шаги.

📎 Кликабельный план видео
📎 YouTube
📎 Презентация PDF из видео

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 О безопасности веб-проекта на Spring

Встречайте годный контент 🌟
В этом ролике речь пойдёт об обеспечении безопасности веб-приложения при помощи Spring Security и будет продемонстрирована настройка цепочки фильтров безопасности.
Здесь показывается использование формы входа, Basic-аутентификации и применение OAuth 2.0/OpenID Connect.

Нереально полезно и информативно

▶️ Youtube

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2024/09/29 07:28:17
Back to Top
HTML Embed Code: