В этом руководстве мы начнем работу с Docker. Для этого создали Spring проект с одной конечной точкой REST и соберем для него образ Docker. Запустим образ Docker внутри контейнера и протестируем конечную APi внутри этого образа.
✔️ Примеры работы с Docker
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤4👍2
🔥 Полезные библиотеки Java
Codename One — это первая открытая мобильная кроссплатформенная среда для разработчиков Java и Kotlin, которая может компилировать байт-код Java в исполняемые файлы ОС (iOS, Android, UWP и т. д.). Это полноценная мобильная платформа с виртуальными машинами, симулятором, инструментами дизайна (визуальная тема/конструктор/CSS), интеграциями с IDE, портами для нескольких ОС и многим другим.
🖥 Github
@javatg
Codename One — это первая открытая мобильная кроссплатформенная среда для разработчиков Java и Kotlin, которая может компилировать байт-код Java в исполняемые файлы ОС (iOS, Android, UWP и т. д.). Это полноценная мобильная платформа с виртуальными машинами, симулятором, инструментами дизайна (визуальная тема/конструктор/CSS), интеграциями с IDE, портами для нескольких ОС и многим другим.
git clone https://github.com/codenameone/CodenameOne
cd CodenameOne/maven
mvn install
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥5❤1
Давайте взглянем на основы фреймворка Spring. Эта статья содержит в себе все основные этапы того, как вы можете создать приложение с использованием фреймворка Spring.
✔️ Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍4🔥3
Сегодня, в этой статье, вы узнаете, как создать полноценную систему регистрации с проверкой электронной почты, используя язык программирования Java, фреймворк Spring Boot и MySQL в качестве базы данных. Ссылка на полный код будет доступна в конце.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍6❤1
Работа с JSON состоит из процессов:
- cериализации — когда мы конвертируем наши данные в JSON.
- десериализации — когда из JSON строки получаем POJO объект.
Для удобной, быстрой и комфортной работы существует множество библиотек, таких как Gson, Jackson и т.д. В данном уроке мы рассмотрим работу с Jackson.
▪ Читать дальше
▪ Зеркало
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3❤2
Представьте, что мы разрабатываем функцию размещения заказа для разных пользователей:
- Обычный пользователь должен оплатить стоимость доставки, которая составляет 10% от стоимости товаров; скидка не предоставляется
- VIP-пользователь также должен оплатить стоимость доставки в размере 10%, но скидка будет предоставлена на 3-й товар и далее.
- Внутреннему пользователю не нужно оплачивать стоимость доставки; скидка не предоставляется.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3❤1
Сжатие данных – очень распространенная тема. В интернете мы можем найти множество материалов о ней. Существуют разные тесты для всех видов алгоритмов сжатия. Тесты производительности для Java существуют, но, все они немного устарели, поскольку были написаны давным-давно.
Эффективность сжатия (как производительности, так и размера) зависит от фактических данных. Поэтому для меня имело смысл повторить тесты, чтобы определить, какой алгоритм (если таковой имеется) подойдёт больше всего. Также хотелось просто побольше узнать о сжатии данных в Java.
▪Читать дальше
▪Зеркало
▪Код из статьи
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥7❤1
Изменение переменной, сделанное в одном потоке, не сразу видно другому потоку. Исправить это можно с помощью volatile — ключевого слова, которое ставится перед переменной.
В отличие от слова synchronized, которое применимо для метода или для блока кода, слово volatile применимо только для переменной.
volatile — это более слабый вариант синхронизации, который иногда бывает достаточным.
Рассмотрим пример, показывающий, что изменение переменной в одном потоке действительно не сразу видно другому потоку (или даже никогда не видно).
volatile – этот модификатор вынуждает потоки отключить оптимизацию доступа и использовать единственный экземпляр переменной.
Если переменная примитивного типа – этого будет достаточно для обеспечения потокобезопасности. Если же переменная является ссылкой на объект – синхронизировано будет исключительно значение этой ссылки. Все же данные, содержащиеся в объекте, синхронизированы не будут!
▪Читать дальше
▪Зеркало
▪Код из статьи
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3❤1
Лямбды в 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
👍13🔥3❤1
🚀 Топ-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
🔥10👍6❤1
За последние несколько лет, микросервисы быстро стали ведущей архитектурой многих технологических компаний, настолько, что все следят за ними.
Микросервис — это веб-сервис, отвечающий за один элемент логики в некой предметной области (очень похоже на класс).
Например, у вас может быть микросервис для аутентификации и авторизации в вашем приложении, один микросервис для обработки потока заказов, другой для пользователей и так далее.
В последние годы спрос на микросервисы сильно вырос, но как и у любой другой технологии, у неё есть свои плюсы и минусы.
▪ Читать дальше
▪ Зеркало
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18👎5❤1🔥1
🖥 Java-Studies
Большой Репозиторий с учебными заметками и программами
для фундаментальных и важных концепций разработки на Java.
Полезный репозиторий с хорошими заметками и кодом. Схемы и детальное обьяснения всех основных концепций.
Дженерики, алгоритмы, Api, сокеты и многое другое.
🖥 Github
@javatg
Большой Репозиторий с учебными заметками и программами
для фундаментальных и важных концепций разработки на Java.
Полезный репозиторий с хорошими заметками и кодом. Схемы и детальное обьяснения всех основных концепций.
Дженерики, алгоритмы, Api, сокеты и многое другое.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤1
Для заданной строки найдите в ней первый неповторяющийся символ, выполнив только один ее обход.
Например,
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
👍19❤3🔥1
📌 Введение в 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
👍10🔥4❤2
В этой статье я покажу вам лучшие плагины, которые я использовал, чтобы сделать приятный интерфейс, повысить свою производительность и, конечно же, сделать IDE Android Studio чертовски потрясающей.
📌 Статья
#android #androidstudio
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🔥1
Комбинации слов, образованные заменой данных цифр соответствующими алфавитами
Для заданного набора положительных чисел найти все возможные комбинации слов, образованные заменой цифр соответствующими символами английского алфавита, т. е. подмножество
{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
❤9🔥3👍2