Давайте взглянем на основы фреймворка Spring. Эта статья содержит в себе все основные этапы того, как вы можете создать приложение с использованием фреймворка Spring.
✔️ Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня, в этой статье, вы узнаете, как создать полноценную систему регистрации с проверкой электронной почты, используя язык программирования Java, фреймворк Spring Boot и MySQL в качестве базы данных. Ссылка на полный код будет доступна в конце.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Работа с JSON состоит из процессов:
- cериализации — когда мы конвертируем наши данные в JSON.
- десериализации — когда из JSON строки получаем POJO объект.
Для удобной, быстрой и комфортной работы существует множество библиотек, таких как Gson, Jackson и т.д. В данном уроке мы рассмотрим работу с Jackson.
▪ Читать дальше
▪ Зеркало
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Представьте, что мы разрабатываем функцию размещения заказа для разных пользователей:
- Обычный пользователь должен оплатить стоимость доставки, которая составляет 10% от стоимости товаров; скидка не предоставляется
- VIP-пользователь также должен оплатить стоимость доставки в размере 10%, но скидка будет предоставлена на 3-й товар и далее.
- Внутреннему пользователю не нужно оплачивать стоимость доставки; скидка не предоставляется.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Сжатие данных – очень распространенная тема. В интернете мы можем найти множество материалов о ней. Существуют разные тесты для всех видов алгоритмов сжатия. Тесты производительности для Java существуют, но, все они немного устарели, поскольку были написаны давным-давно.
Эффективность сжатия (как производительности, так и размера) зависит от фактических данных. Поэтому для меня имело смысл повторить тесты, чтобы определить, какой алгоритм (если таковой имеется) подойдёт больше всего. Также хотелось просто побольше узнать о сжатии данных в Java.
▪Читать дальше
▪Зеркало
▪Код из статьи
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Изменение переменной, сделанное в одном потоке, не сразу видно другому потоку. Исправить это можно с помощью volatile — ключевого слова, которое ставится перед переменной.
В отличие от слова synchronized, которое применимо для метода или для блока кода, слово volatile применимо только для переменной.
volatile — это более слабый вариант синхронизации, который иногда бывает достаточным.
Рассмотрим пример, показывающий, что изменение переменной в одном потоке действительно не сразу видно другому потоку (или даже никогда не видно).
volatile – этот модификатор вынуждает потоки отключить оптимизацию доступа и использовать единственный экземпляр переменной.
Если переменная примитивного типа – этого будет достаточно для обеспечения потокобезопасности. Если же переменная является ссылкой на объект – синхронизировано будет исключительно значение этой ссылки. Все же данные, содержащиеся в объекте, синхронизированы не будут!
▪Читать дальше
▪Зеркало
▪Код из статьи
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Лямбды в Java полезны во многих направлениях. Лямбда-выражения можно использовать для более простых задач, а лямбда-утверждения — для более сложных.
Лямбды могут вызывать другие методы для текущего объекта (this) и объектов, которые находятся в области видимости, таких как текущий элемент итерации и конечная локальная переменная за пределами лямбды. Лямбду всегда можно упростить, поместив код в другой метод.
Написание хороших лямбд требует дисциплины. Например, важно называть параметры понятным образом — так, чтобы названия раскрывали их назначение. Вот простой пример лямбды для фильтрации списка строк:
@Test
public void filterStringsLambda()
{
var list = Lists.mutable.with(
"Atlanta",
"Atlantic City",
"Boston",
"Boca Raton");
var actual = list.stream()
.filter(string -> string.startsWith("At"))
.collect(Collectors.toList());
var expected = List.of("Atlanta", "Atlantic City");
Assertions.assertEquals(expected, actual);
}
▪ Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Топ-10 Java-фреймворков и библиотек для Fullstack веб-разработчиков на Java
Если вы хотите стать Fullstack Java-разработчиком, тем, кто способен создавать как frontend-, так и backend-приложения, используя язык программирования Java, и ищет лучшие ресурсы, такие как онлайн-курсы, тогда вы пришли по адресу.
Помимо стандартных фреймворков, таких как Swing для настольных графических приложений, JavaFX, JSP, EJB и JSF, существует гораздо больше фреймворков и библиотек с открытым исходным кодом, доступных для Java-программистов.
Эти фреймворки не только помогают и ускоряют разработку, но и заставляют использовать лучшие практики, необходимые для создания корпоративного и настольного Java-приложения.
Фреймворки, подобные Spring, которые дают столь необходимый импульс платформе Java, внедряют принцип зависимостей в ядро, что имеет решающее значение для построения слабосвязанной системы.
Аналогичным образом, Struts и Spring MVC значительно упростили веб-разработку. Java-программисты, как начинающие, так и опытные, должны знать об этих фреймворках, ведь они не только помогают им в их работе.
Благодаря ним люди получают новую работу, поскольку всё больше и больше компаний внедряют разработку на основе фреймворков.
Я видел так много резюме, которые не рассматриваются для собеседований, потому что в них нет упоминания о Spring, Struts или Maven. Хотя я не согласен с этой практикой, потому что, если вы хороши в программировании, ООП-дизайне и Java, вы можете быстро их освоить.
В этой статье я поделюсь 10 лучшими фреймворками для Java веб-разработчиков, которые включают в себя core Java framework, unit testing framework, Java web development framework и, конечно же, build framework.
▪ Читать дальше
▪ Зеркало
@javatg
Если вы хотите стать Fullstack Java-разработчиком, тем, кто способен создавать как frontend-, так и backend-приложения, используя язык программирования Java, и ищет лучшие ресурсы, такие как онлайн-курсы, тогда вы пришли по адресу.
Помимо стандартных фреймворков, таких как Swing для настольных графических приложений, JavaFX, JSP, EJB и JSF, существует гораздо больше фреймворков и библиотек с открытым исходным кодом, доступных для Java-программистов.
Эти фреймворки не только помогают и ускоряют разработку, но и заставляют использовать лучшие практики, необходимые для создания корпоративного и настольного Java-приложения.
Фреймворки, подобные Spring, которые дают столь необходимый импульс платформе Java, внедряют принцип зависимостей в ядро, что имеет решающее значение для построения слабосвязанной системы.
Аналогичным образом, Struts и Spring MVC значительно упростили веб-разработку. Java-программисты, как начинающие, так и опытные, должны знать об этих фреймворках, ведь они не только помогают им в их работе.
Благодаря ним люди получают новую работу, поскольку всё больше и больше компаний внедряют разработку на основе фреймворков.
Я видел так много резюме, которые не рассматриваются для собеседований, потому что в них нет упоминания о Spring, Struts или Maven. Хотя я не согласен с этой практикой, потому что, если вы хороши в программировании, ООП-дизайне и Java, вы можете быстро их освоить.
В этой статье я поделюсь 10 лучшими фреймворками для Java веб-разработчиков, которые включают в себя core Java framework, unit testing framework, Java web development framework и, конечно же, build framework.
▪ Читать дальше
▪ Зеркало
@javatg
За последние несколько лет, микросервисы быстро стали ведущей архитектурой многих технологических компаний, настолько, что все следят за ними.
Микросервис — это веб-сервис, отвечающий за один элемент логики в некой предметной области (очень похоже на класс).
Например, у вас может быть микросервис для аутентификации и авторизации в вашем приложении, один микросервис для обработки потока заказов, другой для пользователей и так далее.
В последние годы спрос на микросервисы сильно вырос, но как и у любой другой технологии, у неё есть свои плюсы и минусы.
▪ Читать дальше
▪ Зеркало
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Java-Studies
Большой Репозиторий с учебными заметками и программами
для фундаментальных и важных концепций разработки на Java.
Полезный репозиторий с хорошими заметками и кодом. Схемы и детальное обьяснения всех основных концепций.
Дженерики, алгоритмы, Api, сокеты и многое другое.
🖥 Github
@javatg
Большой Репозиторий с учебными заметками и программами
для фундаментальных и важных концепций разработки на Java.
Полезный репозиторий с хорошими заметками и кодом. Схемы и детальное обьяснения всех основных концепций.
Дженерики, алгоритмы, Api, сокеты и многое другое.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Для заданной строки найдите в ней первый неповторяющийся символ, выполнив только один ее обход.
Например,
Input:
string is ABCDBAGHC
Output:
первый неповторяющийся символ: D
Простым решением было бы сохранить количество каждого символа в map или массиве, пройдя его один раз.
Затем еще раз просмотреть строку, чтобы найти первый символ, имеющий значение 1. Временная сложность этого решения равна O(n), где n длина входной строки. Проблема с этим решением заключается в том, что строка проходится дважды, что нарушает ограничения программы.
Мы можем решить эту задачу за один обход строки. Идея состоит в том, чтобы использовать map для хранения количества каждого отдельного символа и индекса его первого или последнего вхождения в строку. Затем пройтись по map и найти символ с минимальным индексом строки.
import java.util.HashMap;
import java.util.Map;
// Pair class
class Pair<U, V>
{
public U first; // первое поле пары
public V second; // второе поле пары
// Создает новую пару с указанными значениями
private Pair(U first, V second)
{
this.first = first;
this.second = second;
}
// наш метод для создания неизменяемого экземпляра Typed Pair
public static <U, V> Pair <U, V> of(U a, V b)
{
// вызывам приватный конструктор
return new Pair<>(a, b);
}
}
class Main
{
// Функция для поиска первого неповторяющегося символа в
// строке, выполнив только один ее обход
public static int findNonRepeatingChar(String str)
{
// базовый вариант
if (str == null || str.length() == 0) {
return -1;
}
// map для хранения количества символов и индекса их
// последнее вхождение в строку
Map<Character, Pair<Integer, Integer>> map = new HashMap<>();
for (int i = 0; i < str.length(); i++)
{
map.putIfAbsent(str.charAt(i), Pair.of(0, 0));
map.get(str.charAt(i)).first++;
map.get(str.charAt(i)).second = i;
}
// сохраняет индекс первого неповторяющегося символа
int min_index = -1;
// пройти по map и найти символ со счетом 1 и
// минимальный индекс строки
for (var value: map.values())
{
int count = value.first;
int firstIndex = value.second;
if (count == 1 && (min_index == -1 || firstIndex < min_index)) {
min_index = firstIndex;
}
}
return min_index;
}
public static void main(String[] args)
{
String str = "ABCDBAGHC";
int index = findNonRepeatingChar(str);
if (index != -1)
{
System.out.println("The first non-repeating character in the string is "
+ str.charAt(index));
} else {
System.out.println("первый неповторяющийся символ:");
}
}
}
Вывод:
первый неповторяющийся символ: D
Временная сложность этого решения O(n) так как мы делаем один обход строки длины n и один обход map.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Введение в Gradle - систему для автоматизации сборки приложений. Часть 1.
Gradle — система для автоматизации сборки приложений и сбора статистики об использовании программных библиотек, применяющая языки Groovy, Java, JavaScript, Kotlin и т. д., а также решения из фреймворков Apache Ant и Apache Maven.
плагины на JavaScript, C++, Swift, Scala. Система распространяется как программное обеспечение с открытым исходным кодом по лицензии Apache License 2.0.
Назначение Gradle
Ручная сборка приложения для запуска на устройстве требует много времени и ресурсов. Она затягивает процесс разработки и релиза.
Gradle решает реализацию больших многомодульных сборок путем последовательного и параллельного выполнения основных и добавочных модулей.
▪Читать дальше
▪Github
▪Книга DevOps Tools for Java Developers
@javatg
Gradle — система для автоматизации сборки приложений и сбора статистики об использовании программных библиотек, применяющая языки Groovy, Java, JavaScript, Kotlin и т. д., а также решения из фреймворков Apache Ant и Apache Maven.
плагины на JavaScript, C++, Swift, Scala. Система распространяется как программное обеспечение с открытым исходным кодом по лицензии Apache License 2.0.
Назначение Gradle
Ручная сборка приложения для запуска на устройстве требует много времени и ресурсов. Она затягивает процесс разработки и релиза.
Gradle решает реализацию больших многомодульных сборок путем последовательного и параллельного выполнения основных и добавочных модулей.
▪Читать дальше
▪Github
▪Книга DevOps Tools for Java Developers
@javatg
В этой статье я покажу вам лучшие плагины, которые я использовал, чтобы сделать приятный интерфейс, повысить свою производительность и, конечно же, сделать IDE Android Studio чертовски потрясающей.
📌 Статья
#android #androidstudio
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Комбинации слов, образованные заменой данных цифр соответствующими алфавитами
Для заданного набора положительных чисел найти все возможные комбинации слов, образованные заменой цифр соответствующими символами английского алфавита, т. е. подмножество
{1}
можно заменить на A, {2}
можно заменить на B, {1, 0}
можно заменить на J, {2, 1}
можно заменить на U,
так далее.Для каждого
i-того
элемент, есть две возможности – либо этот i тый элемент будет суммироваться со следующимс (i+1) элементом, если число, образованное ими меньше 26 (кол-во букв в английском алфавите) или iый элемент формирует новый символ сам по себе.class Main
{
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Функция для поиска всех возможных комбинаций слов, образованных
путем замены заданных чисел на соответствующие
символ
ы английского алфавита
public static void recur(int[] digits, int i, String str)
{
if (i == digits.length)
{
System.out.println(str);
return;
}
int sum = 0;
// обрабатываем следующие две цифры (i и (i+1))
for (int j = i; j <= Integer.min(i + 1, digits.length - 1); j++)
{
sum = (sum * 10) + digits[j];
// если допустимый символ можно сформировать, взяв одну или обе цифры,
// добавляем его к выводу и повторяем для оставшихся цифр
if (sum > 0 && sum <= 26) {
recur(digits, j + 1, str + alphabet.charAt(sum - 1));
}
}
}
public static void findCombinations(int[] digits)
{
// базовый вариант
if (digits == null || digits.length == 0) {
return;
}
String str = "";
recur(digits, 0, str);
}
public static void main(String[] args)
{
int[] digits = { 1, 2, 2 };
findCombinations(digits);
}
}
Мы также можем решить эту проблему, используя двоичное дерево и рекурсию.
// Класс для хранения узла бинарного дерева
class Node
{
String key;
Node left, right;
// Конструктор
Node(String key)
{
this.key = key;
left = right = null;
}
}
class Main
{
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Функция для печати всех листовых узлов бинарного дерева
public static void print(Node node)
{
if (node == null) {
return;
}
if (node.left == null && node.right == null) {
System.out.print(node.key + " ");
}
else {
print(node.right);
print(node.left);
}
}
// Функция для построения бинарного дерева, в котором каждый конечный узел содержит уникальная комбинация слов
public static void construct(Node root, int[] digits, int i)
{
// Базовый случай: пустое дерево
if (root == null || i == digits.length) {
return;
}
// проверяем, существует ли `digits[i+1]`
if (i + 1 < digits.length)
int sum = 10 * digits[i] + digits[i + 1];
// если обе цифры могут образовывать допустимый символ, создаем из него левого потомка
if (sum <= 26) {
root.left = new Node(root.key + alphabet.charAt(sum - 1));
}
// строим левое поддерево по оставшимся цифрам
construct(root.left, digits, i + 2);
}
// обрабатываем текущую цифру и создаем из нее нужного потомка
root.right = new Node(root.key + alphabet.charAt(digits[i] - 1));
// строим правое поддерево по оставшимся цифрам
construct(root.right, digits, i + 1);
}
public static void main(String[] args)
{
int[] digits = { 1, 2, 2, 1 };
Node root = new Node("");
construct(root, digits, 0);
print(root);
}
}
Вывод:
ABBA ABU AVA LBA LU
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
В статье будет описан процесс поднятия домашнего стенда для экспериментов c k8s, c базовым CI/CD для микросервисов Spring.
Код статьи c инструкцией установки доступен в репозиториях:
https://github.com/alexandr-leonov/eda-configuration
https://github.com/alexandr-leonov/eda-order-service
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
В программировании для написания всевозможных программ и игр разработчик может использовать разнообразные функции и инструменты.
У Java него есть средства, которые значительно упрощают процесс работы с создаваемыми утилитами. Одна из них носит название JUnit. Ей будет уделено основное внимание в данной статье.
▪ Читать
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM