Pascal4eg / Java

 Java | Фишки и трюки

Использование аннотации @FunctionalInterface для определения функциональных интерфейсов

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

При использовании аннотации @FunctionalInterface вы указываете компилятору, что этот интерфейс должен содержать только один абстрактный метод, чтобы избежать возможных ошибок при использовании лямбда-выражений или ссылок на методы.

...

Читать дальше

Использование модификатора volatile для переменных, которые используются множеством потоков

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

...

Читать дальше

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

Код для расчета разницы во времени:

import java.time.Duration;
import java.time.LocalDateTime;

public class TimeDifferenceCalculator {
    public static void main(String[] args) {
        LocalDateTime startTime = LocalDateTime.of(2022, 1, 1, 10, 0, 0);
        LocalDateTime endTime = LocalDateTime.of(2022, 1, 1, 12, 30, 0);
        
        Duration duration = Duration.between(startTime, endTime);
        
        long hours = duration.toHours();
        long minutes = duration.toMinutes() % 60;
        long seconds = duration.getSeconds() % 60;
        
        System.out.println("Time difference: " + hours + " hours, " + minutes + " minutes, " + seconds + " seconds.");
    }
}

...

Читать дальше

Код для реализации уникального идентификатора (UUID)

import java.util.UUID;

public class UniqueIdGenerator {
    public static void main(String[] args) {
        // Генерация случайного уникального идентификатора
        UUID uuid = UUID.randomUUID();
        System.out.println("Уникальный идентификатор: " + uuid);
    
        // Преобразование уникального идентификатора в строку без тире
        String uuidString = uuid.toString().replace("-", "");
        System.out.println("Уникальный идентификатор без тире: " + uuidString);
    }
}

...

Читать дальше

Использование Stream API для работы с коллекциями данных

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
        // Фильтрация элементов, начинающихся с буквы "a" и преобразование в верхний регистр
        fruits.stream()
                .filter(fruit -> fruit.startsWith("a"))
                .map(String::toUpperCase)
                .forEach(System.out::println);
        // Выведет "APPLE"
    }
}

...

Читать дальше

Использование CompletableFuture для асинхронных операций

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

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // Создание CompletableFuture объекта
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
        
        // Добавление операций после выполнения асинхронной задачи
        CompletableFuture<String> result = future.thenApplyAsync(str -> str + " World")
                .thenApply(str -> str + "!");
        
        try {
            // Ожидание результата
            String message = result.get();
            System.out.println(message);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

...

Читать дальше

Обработка исключений с помощью Try-With-Resources

Try-With-Resources - это "новая" конструкция языка, введенная в Java 7, которая облегчает работу с ресурсами такими как файлы или сокеты и сокращает количество кода, необходимого для обработки исключений.

Вот пример использования Try-With-Resources для чтения содержимого файла:

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

...

Читать дальше

Использование анонимных классов

Анонимный класс - это класс без имени, который объявляется и создается внутри другого класса или метода. Он удобен, когда требуется определить класс, который будет использоваться только один раз, и нет необходимости создавать отдельный класс.

public class Main {
    interface Greeting {
        void sayHello();
    }
    public static void main(String[] args) {
        Greeting greeting = new Greeting() {  // объявление и создание анонимного класса
            @Override
            public void sayHello() {
                System.out.println("Привет, мир!");
            }
        };
        greeting.sayHello();  // вызов метода sayHello у анонимного класса
    }
}

...

Читать дальше

Метод для глубокого копирования объектов

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

📌 Вот пример метода для глубокого копирования:

...

Читать дальше

Использование интерфейса Callable вместе с классом Future для выполнения асинхронных задач и получения их результата

ExecutorService executor = null;
try {
    executor = Executors.newFixedThreadPool(1);
    Future<Integer> futureResult = executor.submit(() -> {
        // Выполнение сложной вычислительной задачи
        int result = 0;
        for (int i = 0; i < 100; i++) {
            result += i;
            Thread.sleep(100);
        }
        return result;
    });

    // Другие действия, выполняемые параллельно
    // Ожидание завершения асинхронной задачи и получение результата
    Integer result = futureResult.get();
    System.out.println("Результат: " + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    if (executor != null) executor.shutdown();
}

...

Читать дальше