Easy Java
5.22K subscribers
311 photos
51 videos
463 links
Лучшие обучающие материалы и другие полезности для Java-разработчиков.

Сотрудничество: @heywan_n1

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Download Telegram
🟢 Lambda: Поиск максимального и минимального значения

В лямбда-выражениях удобно находить минимальное и максимальное значения с помощью Comparator.

📌 Пример:

import java.util.List;
import java.util.Comparator;

public class LambdaMinMaxExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(10, 25, 3, 47, 8);

int min = numbers.stream().min((a, b) -> a - b).orElseThrow();
int max = numbers.stream().max((a, b) -> a - b).orElseThrow();

System.out.println("Минимум: " + min); // Вывод: 3
System.out.println("Максимум: " + max); // Вывод: 47
}
}


👍 Разбор:

✔️ min((a, b) -> a - b) — лямбда-компаратор для поиска минимального значения.
✔️ max((a, b) -> a - b) — аналогично, но для максимального.
✔️ orElseThrow() — выбрасывает исключение, если список пуст.

💡 Запомни:

✔️ Лямбда-выражения позволяют сокращать код и упрощать сравнения.
✔️ Можно заменить (a, b) -> a - b на Integer::compare.

📍 Теги: #java #lambda #comparator #min #max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
👨‍💻 Comparator: Поиск максимального и минимального значения

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

📌 Пример:

import java.util.List;
import java.util.Comparator;

public class ComparatorMinMaxExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(10, 25, 3, 47, 8);

int min = numbers.stream().min(Comparator.naturalOrder()).orElseThrow();
int max = numbers.stream().max(Comparator.naturalOrder()).orElseThrow();

System.out.println("Минимум: " + min); // Вывод: 3
System.out.println("Максимум: " + max); // Вывод: 47
}
}



👍 Разбор:

✔️ Comparator.naturalOrder() — встроенный компаратор для сортировки по возрастанию.
✔️ min() и max() используют этот компаратор для поиска крайних значений.
✔️ orElseThrow() — выбрасывает исключение, если коллекция пустая.

💡 Запомни:

✔️ Comparator.naturalOrder() — удобный способ поиска min/max.
✔️ Можно использовать Comparator.reverseOrder() для обратной сортировки.

📍 Теги: #java #comparator #min #max #collections
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🟢 Optional: Избегаем NullPointerException

В
Java класс Optional помогает избежать NullPointerException и делает код читаемым и безопасным.

📌 Пример:

import java.util.Optional;

public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = getName();

// Используем ifPresentOrElse
name.ifPresentOrElse(
n -> System.out.println("Имя: " + n),
() -> System.out.println("Имя отсутствует")
);
}

public static Optional<String> getName() {
return Math.random() > 0.5 ? Optional.of("Алиса") : Optional.empty();
}
}


👍 Разбор:

✔️ Optional.of(value) — создаёт Optional, если значение не null.
✔️ Optional.empty() — создаёт пустой Optional.
✔️ ifPresentOrElse() — удобный способ обработать Optional.

💡 Запомни:

✔️ Optional помогает избежать NullPointerException.
✔️Используй ifPresentOrElse() вместо if (obj != null).

📍 Теги: #java #optional #null #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
Map: Группировка данных с Collectors.groupingBy()

В
Java можно группировать данные в Map, используя Collectors.groupingBy().

📌 Пример:

import java.util.*;
import java.util.stream.Collectors;

public class GroupingExample {
public static void main(String[] args) {
List<String> words = List.of("apple", "banana", "avocado", "blueberry", "cherry");

Map<Character, List<String>> groupedWords = words.stream()
.collect(Collectors.groupingBy(word -> word.charAt(0)));

System.out.println(groupedWords);
}
}

✔️ Вывод:
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}



🔹 Разбор:

✔️ groupingBy() — группирует данные по ключу.
✔️ word.charAt(0) — используем первую букву слова как ключ.
✔️ В результате получается Map<Character, List<String>>.

💡 Запомни:

✔️ groupingBy() удобно использовать для агрегации данных.
✔️ Можно комбинировать с mapping() для преобразования значений.

📍 Теги: #java #stream #collectors #groupingBy #collections
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩5👍31
Recursion vs Iteration: Что выбрать?🗳

Рекурсия и итерация — два способа решения задач. Какой выбрать?

📌 Факториал: Рекурсия vs Итерация

✔️ Рекурсия:

public static int factorialRecursive(int n) {
return (n == 1) ? 1 : n * factorialRecursive(n - 1);
}


✔️ Итерация:

public static int factorialIterative(int n) {
int result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}


👍 Разбор:

✔️ Рекурсия удобна для разделяй и властвуй, но может вызвать StackOverflowError.
✔️ Итерация эффективнее по памяти, но иногда менее читаема.
✔️ В Java лучше избегать глубоких рекурсий из-за ограниченного стека.

💡 Запомни:

✔️ Рекурсия = удобство, но риск StackOverflowError.
✔️ Итерация = производительность и безопасность.

📍 Теги: #java #recursion #iteration #performance #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🤔3
🟢 1. Ошибка: == vs equals() при сравнении строк

В Java строки (String) сравниваются не через ==, а с equals(), иначе возможны ошибки.

📌 Ошибка:

public class StringComparison {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");

System.out.println(s1 == s2); // false (сравнение ссылок)
System.out.println(s1.equals(s2)); // true (сравнение значений)
}
}


👍 Разбор:

✔️ == сравнивает ссылки на объекты в памяти, а не значения.
✔️ equals() сравнивает сами строки.


✔️ Правильный вариант:


if (s1.equals(s2)) {
System.out.println("Строки равны ");
}


💡 Запомни:

✔️ Используй equals() для строк.
✔️ == работает только для пулла строк (String s1 = "hello"; String s2 = "hello";).

А вы знали об этом?

📍 Теги: #java #string #equals #mistakes #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🤯32
Ошибка: ConcurrentModificationException при итерации по списку.

При изменении ArrayList во время итерации можно получить ConcurrentModificationException.

Ошибка:

import java.util.*;

public class ConcurrentModExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5));

for (Integer num : numbers) {
if (num % 2 == 0) {
numbers.remove(num); // ConcurrentModificationException
}
}
}
}



👍 Разбор:

✔️ ArrayList использует модификационный счётчик, который ломается при изменении коллекции во время итерации.
✔️ for-each использует Iterator, который не поддерживает удаление элементов во время итерации.

✔️ Правильный вариант 1: Использовать Iterator.remove()

Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
if (iterator.next() % 2 == 0) {
iterator.remove(); // Работает корректно
}
}


✔️ Правильный вариант 2: Использовать removeIf()

numbers.removeIf(n -> n % 2 == 0); //  Удаляет без исключений


💡 Запомни:

✔️ for-each нельзя использовать для удаления элементов.
✔️ Используй Iterator.remove() или removeIf().

А вы знали об этом?

📍 Теги: #java #concurrentmodification #collections #mistakes #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥127👍5😭1
Ошибка: Автоупаковка (Autoboxing) и производительность.

В Java Integer, Double и другие обёртки примитивов (wrapper classes) используют автоупаковку (autoboxing), которая может снижать производительность.

Ошибка:

public class AutoboxingExample {
public static void main(String[] args) {
Integer sum = 0; // Используем обёртку вместо int

for (int i = 0; i < 1_000_000; i++) {
sum += i; // Автоупаковка на каждой итерации (int → Integer)
}

System.out.println(sum);
}
}


Проблема:

🚨 На каждой итерации создаётся новый объект Integer, что замедляет программу!

✔️ Правильный вариант:

int sum = 0; //  Используем int
for (int i = 0; i < 1_000_000; i++) {
sum += i;
}
System.out.println(sum);



👍 Разбор:

✔️ Автоупаковка создаёт новые объекты, что увеличивает потребление памяти и замедляет код.
✔️ Используй примитивные типы (int, double) там, где не нужна обёртка.

💡 Запомни:

✔️ int быстрее, чем Integer.
✔️ Избегай ненужной автоупаковки в циклах.

А вы знали об этом?

📍 Теги: #java #autoboxing #performance #mistakes #bestpractices
Please open Telegram to view this post
VIEW IN TELEGRAM
👍195
👨‍💻 Задача: Найти два числа в массиве, сумма которых равна целевому значению

📌 Условие:

Дан массив целых чисел и целевое число target. Нужно найти два числа, сумма которых равна target, и вернуть их индексы.
Гарантируется, что решение всегда существует.

✔️ Примеры:

Input: nums = [2, 7, 11, 15], target = 9  
Output: [0, 1] // (2 + 7 = 9)

Input: nums = [3, 2, 4], target = 6
Output: [1, 2] // (2 + 4 = 6)


📌 Решение:

import java.util.HashMap;
import java.util.Map;

public class TwoSum {
public static int[] findTwoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();

for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];

if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}

map.put(nums[i], i);
}

throw new IllegalArgumentException("Решение не найдено");
}

public static void main(String[] args) {
int[] nums = {2, 7, 11, 15};
int target = 9;

int[] result = findTwoSum(nums, target);
System.out.println("[" + result[0] + ", " + result[1] + "]");
}
}


👍 Разбор:

✔️ Используем HashMap для хранения чисел и их индексов.
✔️ Одним проходом по массиву за O(n) проверяем, есть ли нужное число.
✔️ Если target - nums[i] уже есть в map, возвращаем пару индексов.

💡 Запомни:

✔️ HashMap даёт поиск за O(1), что делает алгоритм эффективным.
✔️ Использование map.containsKey() позволяет избежать вложенных циклов.

А вы знали об этом?

📍 Теги: #java #tasks #algorithms #hashmap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123
Ошибка: Сравнение строк через == вместо .equals()

🚨 Одна из самых частых ошибок в Java — сравнение строк через ==.

Ошибка ⚠️ :
public class StringComparison {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2); // true (оба строки из пула строк)
System.out.println(str1 == str3); // false (разные объекты в памяти)
}
}


Что произошло

🚨 == сравнивает ссылки в памяти, а не содержимое строк!

✔️ Правильный вариант:

System.out.println(str1.equals(str2)); //  true
System.out.println(str1.equals(str3)); // true



👍 Разбор:

✔️ == проверяет ссылки, а не содержимое строк.
✔️ Используй .equals() для сравнения значений строк.
✔️ intern() можно использовать для приведения строк в пул строк.

💡 Запомни:

✔️ == сравнивает ссылки.
✔️ .equals() сравнивает содержимое.
✔️ intern() делает строки из new String() частью пула строк.

А вы знали об этом?

📍 Теги: #java #mistakes #bestpractices #string
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍54
🎆 ТОП-3 способа создать Singleton в Java

Singleton — это шаблон проектирования, ограничивающий создание экземпляров класса одним объектом. Рассмотрим три разных подхода к его реализации.


1️⃣ Ленивая инициализация (Lazy Initialization)
Создаёт объект только при первом вызове.

public class LazySingleton {
private static LazySingleton instance;

private LazySingleton() {} // Закрытый конструктор

public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}

👍 Плюсы: Простота
👍 Минусы: Не потокобезопасен


2️⃣ Потокобезопасный Singleton (Double-Checked Locking)
Оптимизированная версия для многопоточной среды.

public class ThreadSafeSingleton {
private static volatile ThreadSafeSingleton instance;

private ThreadSafeSingleton() {}

public static ThreadSafeSingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
}


👍 Плюсы: Потокобезопасен, быстрее synchronized-метода
👍 Минусы: Чуть сложнее реализации


3️⃣ Singleton через enum (Лучший способ)
Рекомендуется в современной Java.

public enum EnumSingleton {
INSTANCE;

public void someMethod() {
System.out.println("Enum Singleton!");
}
}


👍 Плюсы: Простота, безопасность от сериализации, ленивый
👍 Минусы: Нет гибкости (нельзя наследовать)


👍 Разбор:

✔️ LazySingleton удобен, но не подходит для многопоточки.
✔️ ThreadSafeSingleton решает проблему двойной проверкой, но сложнее.
✔️ EnumSingletonсамый надёжный способ, рекомендованный Joshua Bloch.

💡 Какой из способов ты используешь?

📍 Теги: #Java #Singleton #Паттерны
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Что это такое?

В Java паттерн Singleton (Одиночка) используется для того, чтобы гарантировать существование только одного экземпляра класса и предоставить к нему глобальную точку доступа. Один из лучших способов реализации паттерна Singleton в современной Java — использовать enum. Это гарантирует, что экземпляр будет создан только один раз, а также позволяет защититься от проблем многозадачности (multi-threading) и сериализации.

Почему это лучший способ?

1. Гарантированная защита от сериализации: Enum типы в Java автоматически обеспечивают защиту от повторной сериализации, что означает, что даже если вы сериализуете и десериализуете объект, он всегда будет одним и тем же экземпляром.

2. Легкость использования: Просто создайте enum с одним элементом, и он будет работать как Singleton.

3. Простота кода: Реализация паттерна через enum гораздо проще и понятнее, чем традиционные способы через класс с приватным конструктором и методами для получения экземпляра.

4. Защита от многопоточности: Enum в Java гарантированно потокобезопасен.

Как использовать Singleton через enum?

Пример кода:
public enum Singleton {
INSTANCE;

// Пример поля
private int value = 42;

// Пример метода
public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}
}


Объяснение:
INSTANCE — это единственный экземпляр вашего класса. Используется стандартный механизм enum для создания этого экземпляра.
Все поля и методы класса могут быть такими же, как в обычном классе.
Для доступа к экземпляру используйте Singleton.INSTANCE

Пример использования:
public class Main {
public static void main(String[] args) {
// Получение доступа к единственному экземпляру
Singleton singleton = Singleton.INSTANCE;

// Использование метода экземпляра
System.out.println(singleton.getValue()); // Выводит 42

// Изменение значения
singleton.setValue(100);
System.out.println(singleton.getValue()); // Выводит 100
}
}


Почему это удобно?

1. Безопасность при многозадачности: В многозадачной среде enum-тип автоматически позаботится о том, чтобы не создать несколько экземпляров.

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

3. Простота тестирования и расширяемости: Такой подход легко тестировать и можно добавлять новые функции без изменения структуры самого паттерна.

Когда использовать?

Использование enum для реализации Singleton рекомендуется, когда вам нужно:

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

— Потребность в потокобезопасности и защите от возможных ошибок сериализации.

— Желание использовать компактное и понятное решение без дополнительных сложностей.


📍 Теги: #Java #Singleton #Паттерны
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍43