Варианты ответа:
Anonymous Quiz
7%
40000
45%
40000.0
45%
Ошибка компиляции
2%
100001000010000.010000.0
Оглавление часть 4. Spring продолжение
——SPRING CACHE——
Введение в кеширование в Spring
Аннотации @Cacheable и @CacheEvict
Виды кеша в Spring и настройки конфигурации для Redis, Ehcache и Caffeine
Примеры использования кеша на примере Caffeine и Redis
——SPRING AOP——
Основы аспектно-ориентированного программирования (AOP) в Spring
Зачем нужно AOP?
Понятия Joinpoint, Pointcut, Advice
Создание простого аспекта
Аннотации @Before, @After, @Around
Примеры аспектов
Pointcut Expressions
Настройка AOP через XML и аннотации
Практическое использование AOP для логирования
Проверка авторизации для выполнения методов
Транзакционный менеджмент с помощью AOP
Все аннотации AOP и их использование
——SPRING SECURITY——
Введение в Spring Security
Основные принципы безопасности
Spring Security и его интеграция в проект
Аннотации используемые в Spring Security
Аутентификация и Авторизация в Spring Security
Проверка подлинности пользователя в Spring Security
OAuth2 Authentication
Использование базы данных для хранения пользователей в Spring Security
Настройка ролей и прав доступа в Spring Security
JWT (JSON Web Token)
Внедрение JWT-аутентификации в Spring Security
Обработка исключений в Spring Security
Настройка кастомных страниц ошибок в Spring Security
——REST——
REST и его архитектура
Принципы построения RESTful API
Форматы данных: JSON и XML
Настройка сериализации данных в Spring
Работа с HTTP-методами в Spring: GET, POST, PUT, DELETE
Создание CRUD API в Spring
Пагинация и фильтрация данных в REST API с использованием Spring
Обработка ошибок в REST API с использованием Spring Boot
Микросервисы в контексте Spring
Компоненты микросервисной архитектуры
——SPRING TEST——
Введение в тестирование в Spring
Аннотации JUnit 5
Продвинутые аннотации JUnit 5
Введение в Mockito
Проверка вызовов методов с помощью verify в Mockito
Аргумент-матчеры и частичное мокирование
Всё о thenReturn, thenThrow и thenAnswer в Mockito
Тестирование Spring компонентов
Интеграционные тесты с использованием базы данных
Тестирование веб-приложений в Spring
Написание тестов для CRUD REST API
Основы тестирования взаимодействия с базами данных в Spring
Нюансы и продвинутые сценарии тестирования с PostgreSQL
Тестирование сложных сценариев в Spring
Лучшие практики, советы и нюансы тестирования в Spring
——LOMBOK——
Введение в Lombok и базовые аннотации
Lombok, базовые аннотации
Аннотации для конструкторов
Аннотации для управления состоянием
Аннотации для логирования
Аннотации для работы с исключениями
Аннотации для работы с синхронизацией
Аннотации для работы с данными — @Value и @With
Создание кастомных аннотаций с использованием Lombok
Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами
Продвинутые аннотации Lombok и лучшие практики
Лучшие практики использования Lombok
#Contents
——SPRING CACHE——
Введение в кеширование в Spring
Аннотации @Cacheable и @CacheEvict
Виды кеша в Spring и настройки конфигурации для Redis, Ehcache и Caffeine
Примеры использования кеша на примере Caffeine и Redis
——SPRING AOP——
Основы аспектно-ориентированного программирования (AOP) в Spring
Зачем нужно AOP?
Понятия Joinpoint, Pointcut, Advice
Создание простого аспекта
Аннотации @Before, @After, @Around
Примеры аспектов
Pointcut Expressions
Настройка AOP через XML и аннотации
Практическое использование AOP для логирования
Проверка авторизации для выполнения методов
Транзакционный менеджмент с помощью AOP
Все аннотации AOP и их использование
——SPRING SECURITY——
Введение в Spring Security
Основные принципы безопасности
Spring Security и его интеграция в проект
Аннотации используемые в Spring Security
Аутентификация и Авторизация в Spring Security
Проверка подлинности пользователя в Spring Security
OAuth2 Authentication
Использование базы данных для хранения пользователей в Spring Security
Настройка ролей и прав доступа в Spring Security
JWT (JSON Web Token)
Внедрение JWT-аутентификации в Spring Security
Обработка исключений в Spring Security
Настройка кастомных страниц ошибок в Spring Security
——REST——
REST и его архитектура
Принципы построения RESTful API
Форматы данных: JSON и XML
Настройка сериализации данных в Spring
Работа с HTTP-методами в Spring: GET, POST, PUT, DELETE
Создание CRUD API в Spring
Пагинация и фильтрация данных в REST API с использованием Spring
Обработка ошибок в REST API с использованием Spring Boot
Микросервисы в контексте Spring
Компоненты микросервисной архитектуры
——SPRING TEST——
Введение в тестирование в Spring
Аннотации JUnit 5
Продвинутые аннотации JUnit 5
Введение в Mockito
Проверка вызовов методов с помощью verify в Mockito
Аргумент-матчеры и частичное мокирование
Всё о thenReturn, thenThrow и thenAnswer в Mockito
Тестирование Spring компонентов
Интеграционные тесты с использованием базы данных
Тестирование веб-приложений в Spring
Написание тестов для CRUD REST API
Основы тестирования взаимодействия с базами данных в Spring
Нюансы и продвинутые сценарии тестирования с PostgreSQL
Тестирование сложных сценариев в Spring
Лучшие практики, советы и нюансы тестирования в Spring
——LOMBOK——
Введение в Lombok и базовые аннотации
Lombok, базовые аннотации
Аннотации для конструкторов
Аннотации для управления состоянием
Аннотации для логирования
Аннотации для работы с исключениями
Аннотации для работы с синхронизацией
Аннотации для работы с данными — @Value и @With
Создание кастомных аннотаций с использованием Lombok
Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами
Продвинутые аннотации Lombok и лучшие практики
Лучшие практики использования Lombok
#Contents
Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление уже из 5-и частей!
Часть 2 дополнена.
Читайте, используйте, будут вопросы - пишите!
Please open Telegram to view this post
VIEW IN TELEGRAM
Функциональное программирование
Функциональное программирование
Поддержка функционального программирования в Java
Stream API
Функциональные интерфейсы
Создание своего функционального интерфейса
Интерфейс Predicate<T>
Методы and, or, negate класса Predicate и их использование
Интерфейс Consumer<T> и метод accept
Более сложные сценарии использования Consumer
Интерфейс Supplier<T> и метод get
Более сложные сценарии использования Supplier
Интерфейс Function<T, R> и метод apply
Методы andThen, compose и их использование
Методы по умолчанию в интерфейсах (default методы)
Ссылки на методы (Method References)
Далее я продолжу наполнять оглавление!😉
#Contents
Функциональное программирование
Поддержка функционального программирования в Java
Stream API
Функциональные интерфейсы
Создание своего функционального интерфейса
Интерфейс Predicate<T>
Методы and, or, negate класса Predicate и их использование
Интерфейс Consumer<T> и метод accept
Более сложные сценарии использования Consumer
Интерфейс Supplier<T> и метод get
Более сложные сценарии использования Supplier
Интерфейс Function<T, R> и метод apply
Методы andThen, compose и их использование
Методы по умолчанию в интерфейсах (default методы)
Ссылки на методы (Method References)
Далее я продолжу наполнять оглавление!
#Contents
Please open Telegram to view this post
VIEW IN TELEGRAM
Java for Beginner pinned «☄️ Оглавление для обучающих постов. Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление уже из 5-и частей! ✔️ Пользуйтесь на здоровье! 🔜 Часть 1. 🔜 Часть 2. 🔜 Часть 3. SPRING 🔜 Часть 4. SPRING продолжение…»
Вопросы с собеседования 👩💻
Что такое checked и unchecked исключения?
Что такое checked и unchecked исключения?
Anonymous Quiz
75%
Checked исключения проверяются на этапе компиляции, а unchecked — во время выполнения.
2%
Checked исключения возникают только в потоках, а unchecked — в основном потоке.
15%
Checked исключения нельзя обработать, а unchecked — можно.
8%
Checked исключения относятся к ошибкам, а unchecked — к предупреждениям.
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание своего функционального интерфейса
Вы можете создать свой функциональный интерфейс, если встроенные интерфейсы не подходят для ваших задач.
Для этого нужно:
Определить интерфейс с одним абстрактным методом.
Добавить аннотацию @FunctionalInterface.
Пример:
Использование интерфейса с лямбда-выражением
Теперь вы можете использовать этот интерфейс для создания лямбда-выражений:
Нюансы использования
Функциональные интерфейсы могут содержать default-методы и static-методы, но только один абстрактный метод.
Если вы используете аннотацию @FunctionalInterface, компилятор будет проверять, что интерфейс действительно функциональный.
Пример с default-методом
#Java #Training #Medium #Functional_programming #FunctionalInterface
Вы можете создать свой функциональный интерфейс, если встроенные интерфейсы не подходят для ваших задач.
Для этого нужно:
Определить интерфейс с одним абстрактным методом.
Добавить аннотацию @FunctionalInterface.
Пример:
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
Использование интерфейса с лямбда-выражением
Теперь вы можете использовать этот интерфейс для создания лямбда-выражений:
Calculator add = (a, b) -> a + b;
Calculator subtract = (a, b) -> a - b;
System.out.println(add.calculate(10, 5)); // 15
System.out.println(subtract.calculate(10, 5)); // 5
Нюансы использования
Функциональные интерфейсы могут содержать default-методы и static-методы, но только один абстрактный метод.
Если вы используете аннотацию @FunctionalInterface, компилятор будет проверять, что интерфейс действительно функциональный.
Пример с default-методом
@FunctionalInterface
interface Greeting {
void sayHello(String name);
default void sayGoodbye() {
System.out.println("Goodbye!");
}
}
public class Main {
public static void main(String[] args) {
Greeting greeting = name -> System.out.println("Hello, " + name);
greeting.sayHello("Alice"); // Hello, Alice
greeting.sayGoodbye(); // Goodbye!
}
}
#Java #Training #Medium #Functional_programming #FunctionalInterface
Интерфейс Predicate<T>
Predicate<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для проверки условия и возвращает boolean значение (true или false). Интерфейс имеет один абстрактный метод test(T t), который принимает объект типа T и возвращает boolean.
Как работает метод test?
Метод test — это основной метод интерфейса Predicate. Он принимает объект типа T и проверяет его на соответствие некоторому условию. Результатом выполнения метода является boolean.
Пример:
Плюсы и минусы использования Predicate
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко комбинировать условия с помощью методов and, or, negate.
Широко используется в Stream API для фильтрации данных.
Минусы:
Может быть избыточным для простых условий, где можно обойтись обычным if.
Требует понимания функционального программирования для эффективного использования.
Пример использования Predicate в фильтрации данных
Один из самых распространенных сценариев использования Predicate — это фильтрация данных в Stream API.
#Java #Training #Medium #Functional_programming #Predicate
Predicate<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для проверки условия и возвращает boolean значение (true или false). Интерфейс имеет один абстрактный метод test(T t), который принимает объект типа T и возвращает boolean.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Как работает метод test?
Метод test — это основной метод интерфейса Predicate. Он принимает объект типа T и проверяет его на соответствие некоторому условию. Результатом выполнения метода является boolean.
Пример:
Predicate<Integer> isEven = number -> number % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
Здесь мы создали Predicate, который проверяет, является ли число четным. Метод test применяется к числам 4 и 5, возвращая true и false соответственно.
Плюсы и минусы использования Predicate
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко комбинировать условия с помощью методов and, or, negate.
Широко используется в Stream API для фильтрации данных.
Минусы:
Может быть избыточным для простых условий, где можно обойтись обычным if.
Требует понимания функционального программирования для эффективного использования.
Пример использования Predicate в фильтрации данных
Один из самых распространенных сценариев использования Predicate — это фильтрация данных в Stream API.
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
// Создаем Predicate для фильтрации имен, начинающихся на "A"
Predicate<String> startsWithA = name -> name.startsWith("A");
// Фильтруем список с помощью Stream API
List<String> filteredNames = names.stream()
.filter(startsWithA)
.collect(Collectors.toList());
System.out.println(filteredNames); // [Alice]
}
}
В этом примере мы используем Predicate для фильтрации имен, начинающихся на букву "A". Метод filter в Stream API принимает Predicate и оставляет только те элементы, которые удовлетворяют условию.
#Java #Training #Medium #Functional_programming #Predicate
Что выведет код?
#Tasks
import java.util.Arrays;
public class Task280125 {
public static void main(String[] args) {
int[] arr = {5, 3, 9, 1, 7};
Arrays.sort(arr);
System.out.println(arr[arr.length / 2]);
}
}
#Tasks
Не знаю у кого как, но моя кошка именно так и делает. И выглядит порой 😂 😂
https://t.me/Java_for_beginner_dev
#Mems
https://t.me/Java_for_beginner_dev
#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое reflection в Java?
Что такое reflection в Java?
Anonymous Quiz
4%
Это механизм для работы с файлами.
4%
Это механизм для работы с коллекциями.
4%
Это механизм для создания потоков.
87%
Это механизм для анализа и изменения структуры классов во время выполнения.
Методы and, or, negate класса Predicate и их использование
Метод and
Метод and позволяет комбинировать два Predicate с помощью логического оператора "И". Результирующий Predicate вернет true, только если оба исходных Predicate вернут true.
Пример:
Метод or
Метод or комбинирует два Predicate с помощью логического оператора "ИЛИ". Результирующий Predicate вернет true, если хотя бы один из исходных Predicate вернет true.
Пример:
Метод negate
Метод negate возвращает Predicate, который является логическим отрицанием исходного. Если исходный Predicate возвращает true, то negate вернет false, и наоборот.
Пример:
Пример использования комбинированных Predicate в Stream API
Теперь давайте рассмотрим пример, где мы используем комбинированные Predicate для фильтрации данных.
Или укороченный (и предпочтительный) вариант:
#Java #Training #Medium #Functional_programming #Predicate #and #or #negate
Метод and
Метод and позволяет комбинировать два Predicate с помощью логического оператора "И". Результирующий Predicate вернет true, только если оба исходных Predicate вернут true.
Пример:
Predicate<Integer> isEven = number -> number % 2 == 0;
Predicate<Integer> isGreaterThan10 = number -> number > 10;
// Комбинируем два Predicate
Predicate<Integer> isEvenAndGreaterThan10 = isEven.and(isGreaterThan10);
System.out.println(isEvenAndGreaterThan10.test(12)); // true
System.out.println(isEvenAndGreaterThan10.test(8)); // false
Метод or
Метод or комбинирует два Predicate с помощью логического оператора "ИЛИ". Результирующий Predicate вернет true, если хотя бы один из исходных Predicate вернет true.
Пример:
Predicate<String> startsWithA = name -> name.startsWith("A");
Predicate<String> endsWithE = name -> name.endsWith("e");
// Комбинируем два Predicate
Predicate<String> startsWithAOrEndsWithE = startsWithA.or(endsWithE);
System.out.println(startsWithAOrEndsWithE.test("Alice")); // true
System.out.println(startsWithAOrEndsWithE.test("Eve")); // true
System.out.println(startsWithAOrEndsWithE.test("Bob")); // false
Метод negate
Метод negate возвращает Predicate, который является логическим отрицанием исходного. Если исходный Predicate возвращает true, то negate вернет false, и наоборот.
Пример:
Predicate<Integer> isEven = number -> number % 2 == 0;
// Создаем отрицание Predicate
Predicate<Integer> isOdd = isEven.negate();
System.out.println(isOdd.test(5)); // true
System.out.println(isOdd.test(4)); // false
Пример использования комбинированных Predicate в Stream API
Теперь давайте рассмотрим пример, где мы используем комбинированные Predicate для фильтрации данных.
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class CombinedPredicateExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Создаем Predicate для четных чисел и чисел больше 5
Predicate<Integer> isEven = number -> number % 2 == 0;
Predicate<Integer> isGreaterThan5 = number -> number > 5;
// Комбинируем Predicate
Predicate<Integer> isEvenAndGreaterThan5 = isEven.and(isGreaterThan5);
// Фильтруем список с помощью Stream API
List<Integer> filteredNumbers = numbers.stream()
.filter(isEvenAndGreaterThan5)
.collect(Collectors.toList());
System.out.println(filteredNumbers); // [6, 8, 10]
}
}
В этом примере мы комбинируем два Predicate с помощью метода and, чтобы отфильтровать только четные числа, которые больше 5.
Или укороченный (и предпочтительный) вариант:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class CombinedPredicateExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> filteredNumbers = numbers.stream()
.filter(number -> number % 2 == 0 && number > 5)
.collect(Collectors.toList());
System.out.println(filteredNumbers); // [6, 8, 10]
}
}
#Java #Training #Medium #Functional_programming #Predicate #and #or #negate
Интерфейс Consumer<T> и метод accept
Consumer<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для выполнения действий над объектом типа T, не возвращая никакого результата. Интерфейс имеет один абстрактный метод accept(T t), который принимает объект типа T и выполняет над ним некоторое действие.
Как работает метод accept?
Метод accept — это основной метод интерфейса Consumer. Он принимает объект типа T и выполняет над ним некоторое действие. Результатом выполнения метода является void, то есть метод не возвращает никакого значения.
Пример:
Плюсы и минусы использования Consumer
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко выполнять действия над объектами, особенно в сочетании с Stream API.
Поддерживает лямбда-выражения, что делает код более компактным.
Минусы:
Может быть избыточным для простых действий, где можно обойтись обычным методом.
Требует понимания функционального программирования для эффективного использования.
Пример использования Consumer для выполнения действий над объектами
Один из самых распространенных сценариев использования Consumer — это выполнение действий над элементами коллекции.
#Java #Training #Medium #Functional_programming #Consumer #accept
Consumer<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для выполнения действий над объектом типа T, не возвращая никакого результата. Интерфейс имеет один абстрактный метод accept(T t), который принимает объект типа T и выполняет над ним некоторое действие.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Как работает метод accept?
Метод accept — это основной метод интерфейса Consumer. Он принимает объект типа T и выполняет над ним некоторое действие. Результатом выполнения метода является void, то есть метод не возвращает никакого значения.
Пример:
Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
printUpperCase.accept("hello"); // HELLO
Здесь мы создали Consumer, который принимает строку и выводит ее в верхнем регистре. Метод accept применяется к строке "hello", и результат выводится на экран.
Плюсы и минусы использования Consumer
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко выполнять действия над объектами, особенно в сочетании с Stream API.
Поддерживает лямбда-выражения, что делает код более компактным.
Минусы:
Может быть избыточным для простых действий, где можно обойтись обычным методом.
Требует понимания функционального программирования для эффективного использования.
Пример использования Consumer для выполнения действий над объектами
Один из самых распространенных сценариев использования Consumer — это выполнение действий над элементами коллекции.
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
// Создаем Consumer для вывода имен в верхнем регистре
Consumer<String> printUpperCase = name -> System.out.println(name.toUpperCase());
// Применяем Consumer к каждому элементу списка
names.forEach(printUpperCase);
}
}
В этом примере мы используем Consumer для вывода каждого имени из списка в верхнем регистре. Метод forEach принимает Consumer и применяет его к каждому элементу списка.
#Java #Training #Medium #Functional_programming #Consumer #accept
Что выведет код?
#Tasks
import java.util.TreeMap;
public class Task290125 {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
map.put("date", 4);
System.out.println(map.lowerKey("banana"));
}
}
#Tasks