Telegram Web Link
Глубокое погружение в лямбда-выражения на Java

Это руководство полностью посвящено освоению лямбда-выражений на Java. Вы узнаете всё, что вам нужно знать, от основ создания и работы до более продвинутых тем, таких как функциональные интерфейсы и ссылки на методы. Независимо от того, новичок вы или опытный разработчик, это руководство поможет вам повысить уровень вашей лямбда-игры. Итак, давайте погрузимся в мир функционального программирования с помощью Java-лямбд!

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

TL; DR: Лямбда-выражения – это мощный инструмент для Java-разработчиков, который включает парадигмы функционального программирования и предоставляет способ работы с коллекциями и потоками в Java. Освоив лямбда-выражения, вы, как разработчик, будете писать лучший код, работать эффективнее и создавать более удобные в обслуживании и масштабируемые приложения.

Читать

@javatg
7👍6🔥2
🖥 Альтернатива Java 8: что умеет VAVR

VAVR, который много лет назад назывался JavaSlang, — это Java API, который привносит возможности функционального программирования в код, а также предоставляет отличный API для неизменяемых коллекций. В этой статье рассмотрим обычный код на Java и его эквивалент с VAVR, чтобы вы увидели, как приятно работать с этой библиотекой.

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍31
Пять задач, которые приходится решать при трудоустройстве начинающим Java-разработчикам

В процессе подбора кандидатов работодатель хочет понять, насколько ему подходит тот или иной соискатель — насколько он комфортен в общении и работе, обладает необходимым опытом и, что самое важное, техническими навыками для предстоящей работы.

В этой статье я приведу примеры конкретных задач, которые могут давать на собеседованиях, и разберу, на что смотрит работодатель при их решении.

Читать

@javatg
👍194🔥2
🖥 Java Multithreading Madness: Приготовьтесь раскачать свои потоки!

В этой статье мы погрузимся в Java Multithreading на практике.

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111🔥1
🖥 QuestDB

База данных временных рядов с открытым исходным кодом для быстрой загрузки и SQL-запросов.

🖥 Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍21
🌕 Проверка идентификационных номеров: реализация алгоритма Луны на Java

public static boolean validateNumber(String number){
/*
Validation of user input: blank spaces are removed from the
numeric string. Also, the code ensures that the input is numeric
*/
number = number.replaceAll(" ", "");

try{
Long.parseLong(number);
} catch (NumberFormatException e){
System.out.println("Invalid input");
return false;
}

int sum = 0;
boolean alternateDigit = false;

/*
Starting from the right of the string, the code loops through each
digit and multiplies every second digit by 2.
*/

for(int i = number.length()-1; i >= 0; i--){
int digit = Integer.parseInt(number.substring(i, i+1));
if(alternateDigit){
digit *= 2;
if(digit > 9){
digit = 1 + (digit % 10);
}
}
sum += digit;
alternateDigit = !alternateDigit;
}

return (sum % 10 == 0);
}

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

Затем код перебирает каждую цифру, начиная справа, чтобы выполнить действия, описанные в разделе выше. Каждая вторая цифра умножается на 2, и в тех случаях, когда в результате получается число больше 9, эти две цифры суммируются вместе, чтобы вычислить однозначное число.

На каждой итерации цикла полученное число суммируется с переменной sum, которая используется для отслеживания общей суммы. После завершения цикла метод возвращает true, если сумма делится на 10.

Полный код можно найти на Github.

Отправляйте свою реализацию в комментарии
👇

@javatg
🔥8👍52👎1
🖥 Класс данных в Kotlin

Иногда в программах приходится создавать классы исключительно для хранения данных, а затем — функции определенных стандартов внутри этих классов.

В Kotlin все эти проблемы решаются с помощью классов данных, создаваемых с той же целью, но функции определенных стандартов в них содержатся автоматически:

data class Person(val name: String, val surname: String)

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8👎21🔥1
🖥 Задача с leetcode. Max Area of Island

Максимальная площадь острова

Сложность: Средняя

Условие задачи: Условие задачи:

Дан двумерный массив размера m x n. "1" отвечает за сушу, "0" - за океан. Необходимо опеределить максмимальную площадь острова из островов, расположенных на карте.

Островом считается территория, образованная из "1", расположенных сверху, справа, снизу и слева относительно друг друга.

Пример:

Ввод:
grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]

Вывод: 6

Ввод: grid = [[0,0,0,0,0,0,0,0]]

Вывод: 0

Решение

Временная сложность: O(m*n)
Пространственная сложность: O(m*n)

class Solution {
public int maxAreaOfIsland(int[][] grid) {
int maxArea = 0;
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[0].length; j++) {
if(grid[i][j] == 1) {
maxArea = Math.max(maxArea, findArea(grid, i, j));
}
}
}
return maxArea;
}

private int findArea(int[][] grid, int row, int col) {
if(row < 0 || row >= grid.length || col < 0 || col >= grid[0].length || grid[row][col] == 0) {
return 0;
}

grid[row][col] = 0;
int count = 1;

count += findArea(grid, row, col-1);
count += findArea(grid, row, col+1);
count += findArea(grid, row-1, col);
count += findArea(grid, row+1, col);

return count;
}
}


Пишите свое решение в комментариях👇

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍144👎2🔥1
🖥 Бесплатный курс по информатике от MIT

На первый взгляд может показаться, что это очередной курс по Java, но это не так. Цель лекций — научить студентов писать качественный, понятный код с использованием лучших практик и тестирования.

Каждый урок подкреплён практикой с заданиями для проверки усвоения материала и заданиями:

https://openlearninglibrary.mit.edu/courses/course-v1:MITx+6.005.1x+3T2016/course/

#java

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍154👎1🔥1
🖥 ActiveJ

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

🖥 Github

#github #java

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2🔥2😱2🤔1
🖥 Утилитные классы в Kotlin с точки зрения Java-разработчика

Одним из достоинств Kotlin, отличающих его от других языков, в том числе Java, является подход к реализации утилитных классов. Утилиты могут быть полезными инструментами в разработке программного обеспечения, хотя и не всегда являются лучшим выбором при проектировании объектно-ориентированных систем.

Как Java-разработчику, вам будет полезно рассмотреть различные способы реализации утилитных классов в Kotlin и узнать, что делается в этом языке “под капотом”. Kotlin предлагает целый ряд различных способов, упрощающих переход от Java, начиная от сокращения стереотипного кода и заканчивая улучшением читаемости кода.

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

Как вам известно, создать утилитный класс в Java довольно просто. Процесс включает следующие шаги.

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥1
Задача. Слияние двух бинарных деревьев

Сложность: Лёгкая

Условие задачи: Даны два бинарных дерева, необходимо осуществить их наложение друг на друга и вывод результатов в новом дереве.

Примечание: Наложение представляет из себя суммирование соответствующих значений из узлов двух деревьев.

Пример:

Ввод:
root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
Вывод:
[3,4,5,5,4,null,7]

Ввод:
root1 = [1], root2 = [1,2]
Вывод:
[2,2]

Решение

class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1==null && root2==null) return null;
if (root1==null) return root2;
if (root2==null) return root1;
root1.val = root1.val+root2.val;
root1.left = mergeTrees(root1.left, root2.left);
root1.right = mergeTrees(root1.right, root2.right);
return root1;
}
}

Пишите свое мнение в комментариях👇

@javatg
👍133🔥1
👍91🔥1
🎧 JavaFX пример MP3-плеера

Это простой пример mp3-плеера, созданного с помощью JavaFX. Приложение имеет кнопку для открытия и воспроизведения трека, кнопки паузы, возобновления и остановки с соответствующими функциями. Для воспроизведения музыки мы используем класс MediaPlayer -> Класс MediaPlayer предоставляет элементы управления для воспроизведения мультимедиа.

MediaPlayer предоставляет элементы управления pause(), play(), stop() и seek(), а также свойства rate и autoPlay, которые применяются ко всем типам медиа. В коде также представлены свойства balance, mute и volume, которые управляют характеристиками воспроизведения аудио.

Читать

@javatg
👍11🔥3👎21
🖥 20 приемов работы на Java, которые помогут вам улучшить качество кода

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

1. По возможности отдавайте предпочтение примитивам, а не классам-оболочкам
Long idNumber;
long idNumber; // long занимает меньше памяти, чем Long


2. Попробуйте использовать подходящий тип для вашей переменной

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

int birthYear;
short birthYear; // лучше, потому что год рождения не может быть пятизначным


int personRunningSpeedKmHour;
byte personRunningSpeedKmHour; // лучше, потому что скорость движения человека ограничена

3. При проверке нечетности числа побитовый оператор AND намного быстрее, чем арифметический оператор по модулю
public boolean isOdd(int num) {
return (num & 1) != 0;
}
// лучший способ проверить нечетность числа


4. Избегайте избыточной инициализации (0, false, null..)
Не инициализируйте переменные с их инициализацией по умолчанию, например, boolean по умолчанию имеет значение false, поэтому избыточно инициализировать его значением false.

String name = null; // избыточно
int speed = 0; // избыточно
boolean isOpen = false; // избыточно


String name;
int speed;
boolean isOpen;
// те же значения в более чистом коде


5. Объявляйте членов класса закрытыми везде, где это возможно, и всегда давайте модификатору доступа максимально ограниченный доступ

public int age; // очень плохо
int age; // плохо
private int age; // хорошо


6. Избегайте использования ключевого слова “new” при создании строки

String s1 = new String("AnyString") ; // плохая реализация
// Конструктор создает новый объект и добавляет литерал в кучу

String s2 = "AnyString" ; // хорошо: быстрое создание экземпляра


// Этот ярлык ссылается на элемент в пуле строк и создает новый объект, только если литерал отсутствует в пуле строк.

7. Для объединения нескольких строк используйте StringBuilder или StringBuffer вместо использования оператора +
Оператор + неэффективен, поскольку компилятор Java создает несколько промежуточных объектов String перед созданием окончательной объединенной строки.

StringBuilder или StringBuffer изменяют String без создания промежуточных объектов String.

String address = streetNumber +" "+ streetName +" "
+cityName+" "+cityNumber+" "+ countryName; // плохо


StringBuilder address = new StringBuilder(streetNumber).append(" ")
.append(streetName).append(" ").append(cityName).append(" ")
.append(cityNumber).append(" ").append(countryName); // хорошо

Учтите, что StringBuilder не потокобезопасен, не синхронизирован, но он быстрее, чем StringBuffer, который потокобезопасен и синхронизирован.

8. Используйте подчеркивание в числовых литералах

int myMoneyInBank = 58356823;
int myMoneyInBank = 58_356_823; // лучше читаемый код

long billsToPay = 1000000000L;
long billsToPay = 1_000_000_000L; // лучше читаемый код

9. Избегайте использования “for loop” с индексами
Не используйте for loop с переменной индекса (или счетчика), если вы можете заменить его расширенным циклом for (начиная с Java 5) или forEach (начиная с Java 8). Это связано с тем, что переменная индекса подвержена ошибкам, поскольку мы можем случайно изменить ее в теле цикла или начать индекс с 1 вместо 0.

for (int i = 0; i < names.length; i++)
{ saveInDb(names[i]); }

for (String name : names)
{ saveInDb(name); } // более чистый код


10. Заменяйте try-catch-finally на try-with-resources

Scanner scanner = null;
try
{scanner = new Scanner(new File("test.txt"));
while (scanner.hasNext())
{System.out.println(scanner.nextLine());}}
catch (FileNotFoundException e)
{e.printStackTrace();}
finally
{if (scanner != null)
{scanner.close();}}
// подвержено ошибкам, так как мы можем забыть закрыть сканер в блоке finally

try (Scanner scanner = new Scanner(new File("test.txt")))
{while (scanner.hasNext())
{System.out.println(scanner.nextLine());}}
catch (FileNotFoundException fnfe)
{fnfe.printStackTrace();}
// чище и более лаконично


Читать дальше
Please open Telegram to view this post
VIEW IN TELEGRAM
👍404👎4🔥3🥰1
🖥 Как перебрать Hashmap с помощью цикла. Понимание Void и Null в Java с примерами

В этом руководстве подробно рассмотрено, как перебирать Hashmap, используя различные типы циклов в Java.

Как перебрать Hashmap в Java с помощью цикла for-each
Один из самых простых способов перебора Hashmap — использование цикла for-each. Вот пример того, как это сделать:

HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}

В этом примере мы сначала создаем новый Hashmap
и добавляем к нему несколько пар ключ-значение. Затем мы используем цикл for-each для итерации по Hashmap, извлекая каждую пару ключ-значение как объект Map.Entry. Затем мы извлекаем ключ и значение из каждого объекта Map.Entry и выводим их на консоль.

Как выполнить итерацию по Hashmap в Java, используя цикл while с итератором.
Другой способ выполнить итерацию по Hashmap — использовать цикл while с итератором. Перед вами пример того, как это сделать:

HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}

Здесь мы снова создаем новый Hashmap и добавляем к нему несколько пар ключ-значение. Затем мы создаем новый объект Iterator с помощью метода entrySet(), который возвращает набор пар ключ-значение в виде объектов Map.Entry. Затем мы используем цикл while с методами hasNext() и next() для перебора набора и извлечения каждой пары ключ-значение. И наконец, мы извлекаем ключ и значение из каждого объекта Map.Entry и выводим их на консоль.

Как перебирать Hashmap Java с помощью for loop с keySet()


В Java метод keySet() — это метод класса java.util.HashMap, который возвращает возвращает установленное представление ключей, содержащихся в Hashmap. Это означает, что он возвращает набор всех ключей в Hashmap, которые можно использовать для перебора ключей или выполнения над ними других операций.

То, что метод keySet() возвращает набор уникальных элементов без дубликатов, связано с тем, что ключи в Hashmap должны быть уникальными, а метод keySet() гарантирует, что возвращаемый им набор ключей не содержит повторяющихся значений.

Мы также можем перебирать Hashmap, используя цикл for с методом keySet(). Вот пример того, как это выполнить:

ashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key: " + key + ", Value: " + value);

В данном примере мы снова создаем новый Hashmap и добавляем к ней несколько пар ключ-значение. Затем мы используем цикл for с методом keySet() для итерации по Hashmap, извлечения каждого ключа и использования его для получения соответствующего значения из Hashmap. Затем мы выводим ключ и значение на консоль.

Читать полностью

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥31
🧮Как исправлять исключения в Java — подробное руководство

Это руководство поможет вам научиться исправлять распространенные исключения в Java. Помимо теории, вы увидите примеры кода по исправлению таких проблем.

Общие рекомендации по предотвращению исключений в Java

Чтобы избежать появления каких-либо исключений в Java, важно понимать и следовать рекомендациям по кодированию:

1. Всегда проверяйте ввод пользователя, прежде чем использовать его в своем коде.

2. Используйте блоки try-catch, throws, throw, в зависимости от того, что подходит для конкретного сценария.

3. Не пренебрегайте сообщениями в коде об обработках и наличии ошибок. Это поможет определить и исправить проблемы.

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

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

6. Обновляйте свои зависимости API, чтобы убедиться, что вы используете самые последние и самые стабильные версии библиотек и фреймворков.

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

8. Отслеживайте производительность вашего приложения и журналы, чтобы быстро выявлять и устранять любые проблемы.

9. Будьте в курсе передовых практик безопасности, чтобы убедиться, что ваш код безопасен и защищен от любых потенциальных атак.

10. Тщательно документируйте свой код и его исключения, чтобы другим разработчикам было легче его понять и поддерживать.

Читать полностью

@javatg
👍131👎1🔥1
🖥 Kotlin: вложенный и внутренний классы

Разберемся, в чем основное различие между вложенным и внутренним классами. В Kotlin класс может объявляться внутри другого класса, причем двумя способами.

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114🥰1
📝Как инициализировать ArrayList в Java.

ArrayList — это реализация изменяемого массива интерфейса List, которая используется для хранения и управления коллекцией похожих переменных. ArrayList напоминает массив, но обеспечивает большую гибкость. Объект ArrayList более динамичен и дает вам широкий контроль над элементами в коллекции.

Как объявить ArrayList со значениями в Java

Объявить ArrayList в Java можно следующим способом:

import java.util.ArrayList;

public class ArrayListTut {
public static void main(String[] args) {

ArrayList<String> people = new ArrayList<>();

}
}


Перед тем, как использовать ArrayList, вы должны сначала импортировать его из одноименного класса: import java.util.ArrayList;.

После этого вы можете создать новый объект ArrayList. В приведенном выше коде мы создали такой объект под именем people.

Обратите внимание, что тип данных ArrayList указывается в угловых скобках: ArrayList<String>.

Несмотря на то, что мы создали объект ArrayList, в нем пока нет элементов. Далее вы узнаете, как добавлять к нему элементы.

Учтите, что вы можете создать ArrayList со значениями/элементами в точке объявления, используя метод add в блоке инициализатора:


import java.util.ArrayList;

public class ArrayListTut {
public static void main(String[] args) {

ArrayList<String> people = new ArrayList<>() {{
add("John");
add("Jane");
add("Doe");
}};

System.out.println(people);
// [John, Jane, Doe]
}
}


Читать полностью

@javatg
👍18👎3🔥1🥰1
🖥 Error Prone Support

Error Prone Support -- это инструмент статического анализа для Java, который выявляет распространенные ошибки во время компиляции.

Это библиотека является расширенной версии
Error Prone с дополнительными средствами проверки ошибок.

🖥 Github
🔍 Документация

#github #java

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥2
2025/10/01 21:59:26
Back to Top
HTML Embed Code: