Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое this в Java?
Что такое this в Java?
Anonymous Quiz
84%
Это ссылка на текущий объект.
10%
Это ссылка на родительский класс.
4%
Это ключевое слово для создания потоков.
2%
Это ключевое слово для создания анонимных классов.
Методы andThen, compose и их использование
Метод andThen
Метод andThen позволяет комбинировать две функции таким образом, что сначала выполняется первая функция, а затем вторая. Результат первой функции передается в качестве входного аргумента второй функции.
Пример:
Метод compose
Метод compose позволяет комбинировать две функции таким образом, что сначала выполняется вторая функция, а затем первая. Результат второй функции передается в качестве входного аргумента первой функции.
Пример:
Пример использования Function в Stream API
Function часто используется в Stream API для преобразования данных.
Пример использования Function с другими функциональными интерфейсами
Function можно комбинировать с другими функциональными интерфейсами, такими как Predicate, для создания более сложных сценариев.
#Java #Training #Medium #Functional_programming #Function #andThen #compose
Метод andThen
Метод andThen позволяет комбинировать две функции таким образом, что сначала выполняется первая функция, а затем вторая. Результат первой функции передается в качестве входного аргумента второй функции.
Пример:
Function<String, Integer> stringLength = str -> str.length();
Function<Integer, String> lengthDescription = length -> "Length is " + length;
// Комбинируем две функции
Function<String, String> describeLength = stringLength.andThen(lengthDescription);
System.out.println(describeLength.apply("Hello")); // Length is 5
В этом примере мы создали две функции: одна преобразует строку в ее длину, а другая преобразует длину в описание. Метод andThen объединяет их, и результат выполнения describeLength — это описание длины строки.
Метод compose
Метод compose позволяет комбинировать две функции таким образом, что сначала выполняется вторая функция, а затем первая. Результат второй функции передается в качестве входного аргумента первой функции.
Пример:
Function<Integer, String> intToString = num -> "Number is " + num;
Function<String, Integer> stringLength = str -> str.length();
// Комбинируем две функции
Function<String, String> describeLength = intToString.compose(stringLength);
System.out.println(describeLength.apply("Hello")); // Number is 5
В этом примере мы создали две функции: одна преобразует строку в ее длину, а другая преобразует число в строку с описанием. Метод compose объединяет их, и результат выполнения describeLength — это описание длины строки.
Пример использования Function в Stream API
Function часто используется в Stream API для преобразования данных.
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class StreamFunctionExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
// Создаем Function для преобразования имен в верхний регистр
Function<String, String> toUpperCase = str -> str.toUpperCase();
// Преобразуем список имен в список имен в верхнем регистре
List<String> upperCaseNames = names.stream()
.map(toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseNames); // [ALICE, BOB, CHARLIE, DAVID, EVE]
}
}
В этом примере мы используем Function для преобразования списка имен в список имен в верхнем регистре. Метод map в Stream API принимает Function и применяет его к каждому элементу потока.
Пример использования Function с другими функциональными интерфейсами
Function можно комбинировать с другими функциональными интерфейсами, такими как Predicate, для создания более сложных сценариев.
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class CombinedExample {
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");
// Создаем Function для преобразования имен в их длины
Function<String, Integer> nameLength = str -> str.length();
// Фильтруем и преобразуем имена
List<Integer> lengths = names.stream()
.filter(startsWithA)
.map(nameLength)
.collect(Collectors.toList());
System.out.println(lengths); // [5]
}
}
В этом примере мы используем Predicate для фильтрации имен, начинающихся на "A", и Function для преобразования отфильтрованных имен в их длины.
#Java #Training #Medium #Functional_programming #Function #andThen #compose
Всем доброго субботнего утра! ☀️
Вот и начался последний месяц зимы!🥶
Какие планы на выходные?🏖️
А я ломаю голову что показать Вам завтра... Нужно что-то простое, но интересное и нужное в текущем стеке технологий...
Соберу сейчас варианты и ниже организую голосование😎 для выбора.
Предлагайте!☝️
Всем хороших выходных!🤟
Вот и начался последний месяц зимы!
Какие планы на выходные?
А я ломаю голову что показать Вам завтра... Нужно что-то простое, но интересное и нужное в текущем стеке технологий...
Соберу сейчас варианты и ниже организую голосование
Предлагайте!
Всем хороших выходных!
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! 🖐
Сегодня как всегда в 16:00 по МСК, я жду вас на встречу, где мы начнем писать сервис доставки товаров с привязкой к Яндекс Картам.😏
Ничего необычного, но пройдемся по стандартам создания Rest-приложений, продумаем логику бэкенда да и что-то напишем🫣
Рекомендуется всем кто хочет набить руку в написании бэка для web-приложений! 🫵
И раз предложений ни от кого не поступило я придумал тему сам 😜
Жду всех, как всегда 🤨 🫡
Сегодня как всегда в 16:00 по МСК, я жду вас на встречу, где мы начнем писать сервис доставки товаров с привязкой к Яндекс Картам.
Ничего необычного, но пройдемся по стандартам создания Rest-приложений, продумаем логику бэкенда да и что-то напишем
Рекомендуется всем кто хочет набить руку в написании бэка для web-приложений! 🫵
Please open Telegram to view this post
VIEW IN TELEGRAM
Методы по умолчанию в интерфейсах (default методы)
Методы по умолчанию — это методы в интерфейсах, которые имеют реализацию по умолчанию. Они были добавлены в Java 8, чтобы позволить разработчикам добавлять новые методы в интерфейсы, не нарушая существующие реализации этих интерфейсов.
До Java 8 интерфейсы могли содержать только абстрактные методы (без реализации). Это создавало проблемы при необходимости добавить новый метод в интерфейс, так как все классы, реализующие этот интерфейс, должны были бы предоставить реализацию нового метода. Методы по умолчанию решают эту проблему.
Пример:
Зачем они были добавлены в Java 8?
Методы по умолчанию были добавлены для поддержки эволюции API. Например, в Java 8 была добавлена поддержка лямбда-выражений, и для этого потребовалось добавить новые методы в интерфейсы коллекций, такие как forEach, stream и другие. Если бы эти методы были абстрактными, все существующие классы, реализующие эти интерфейсы, сломались бы. Методы по умолчанию позволили добавить новые методы без нарушения обратной совместимости.
Пример:
Конфликты при множественном наследовании интерфейсов и их разрешение
Если класс реализует два интерфейса, и оба интерфейса имеют метод по умолчанию с одинаковой сигнатурой, возникает конфликт. В этом случае компилятор требует, чтобы класс явно переопределил этот метод.
Пример:
Плюсы и минусы методов по умолчанию
Плюсы:
Гибкость API: Позволяют добавлять новые методы в интерфейсы без нарушения существующих реализаций.
Обратная совместимость: Упрощают эволюцию библиотек и фреймворков.
Повторное использование кода: Реализация по умолчанию может быть использована в нескольких классах.
Минусы:
Сложность отладки: Если метод по умолчанию используется в нескольких интерфейсах, может быть сложно отследить, какая реализация используется.
Конфликты при множественном наследовании: Требуют явного переопределения в случае конфликтов.
#Java #Training #Medium #Functional_programming #Interface #default
Методы по умолчанию — это методы в интерфейсах, которые имеют реализацию по умолчанию. Они были добавлены в Java 8, чтобы позволить разработчикам добавлять новые методы в интерфейсы, не нарушая существующие реализации этих интерфейсов.
До Java 8 интерфейсы могли содержать только абстрактные методы (без реализации). Это создавало проблемы при необходимости добавить новый метод в интерфейс, так как все классы, реализующие этот интерфейс, должны были бы предоставить реализацию нового метода. Методы по умолчанию решают эту проблему.
Пример:
interface Vehicle {
void start(); // Абстрактный метод
default void stop() { // Метод по умолчанию
System.out.println("Vehicle stopped");
}
}
class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.start(); // Вызов абстрактного метода
car.stop(); // Вызов метода по умолчанию
}
}
В этом примере метод stop() имеет реализацию по умолчанию, и класс Car не обязан его переопределять.
Зачем они были добавлены в Java 8?
Методы по умолчанию были добавлены для поддержки эволюции API. Например, в Java 8 была добавлена поддержка лямбда-выражений, и для этого потребовалось добавить новые методы в интерфейсы коллекций, такие как forEach, stream и другие. Если бы эти методы были абстрактными, все существующие классы, реализующие эти интерфейсы, сломались бы. Методы по умолчанию позволили добавить новые методы без нарушения обратной совместимости.
Пример:
interface List<E> {
void add(E element); // Абстрактный метод
default void forEach(Consumer<? super E> action) { // Метод по умолчанию
for (E element : this) {
action.accept(element);
}
}
}
Теперь все классы, реализующие List, могут использовать метод forEach без необходимости его переопределения.
Конфликты при множественном наследовании интерфейсов и их разрешение
Если класс реализует два интерфейса, и оба интерфейса имеют метод по умолчанию с одинаковой сигнатурой, возникает конфликт. В этом случае компилятор требует, чтобы класс явно переопределил этот метод.
Пример:
interface A {
default void show() {
System.out.println("Interface A");
}
}
interface B {
default void show() {
System.out.println("Interface B");
}
}
class C implements A, B {
@Override
public void show() {
System.out.println("Class C");
}
}
public class Main {
public static void main(String[] args) {
C c = new C();
c.show(); // Вывод: Class C
}
}
В этом примере класс C должен переопределить метод show(), чтобы разрешить конфликт между интерфейсами A и B.
Плюсы и минусы методов по умолчанию
Плюсы:
Гибкость API: Позволяют добавлять новые методы в интерфейсы без нарушения существующих реализаций.
Обратная совместимость: Упрощают эволюцию библиотек и фреймворков.
Повторное использование кода: Реализация по умолчанию может быть использована в нескольких классах.
Минусы:
Сложность отладки: Если метод по умолчанию используется в нескольких интерфейсах, может быть сложно отследить, какая реализация используется.
Конфликты при множественном наследовании: Требуют явного переопределения в случае конфликтов.
#Java #Training #Medium #Functional_programming #Interface #default
Что выведет код?
#Tasks
public class Task030225 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("hello");
sb.append(" world").reverse().delete(0, 6).reverse();
System.out.println(sb);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое super в Java?
Что такое super в Java?
Anonymous Quiz
2%
Это ссылка на текущий объект.
90%
Это ссылка на родительский класс.
5%
Это ключевое слово для создания потоков.
2%
Это ключевое слово для создания анонимных классов.
Ссылки на методы (Method References)
Ссылки на методы (Method References) — это способ сослаться на метод, не вызывая его. Они были добавлены в Java 8 как часть поддержки лямбда-выражений. Ссылки на методы позволяют сделать код более компактным и читаемым, особенно когда лямбда-выражение просто вызывает уже существующий метод.
Синтаксис ссылки на метод:
Типы ссылок на методы
В Java существует четыре типа ссылок на методы:
Ссылка на статический метод
Используется для ссылки на статический метод класса.
Пример:
Ссылка на метод экземпляра
Используется для ссылки на метод конкретного объекта.
Пример:
Ссылка на метод произвольного объекта
Используется для ссылки на метод объекта, который будет передан в качестве аргумента.
Пример:
Ссылка на конструктор
Используется для ссылки на конструктор класса.
Пример:
Как это работает под капотом?
Ссылки на методы компилируются в объекты функциональных интерфейсов. Например, ссылка String::toUpperCase компилируется в реализацию функционального интерфейса, который вызывает метод toUpperCase на переданном объекте.
Пример:
Плюсы и минусы ссылок на методы
Плюсы:
Упрощение кода: Ссылки на методы делают код более компактным и читаемым.
Повторное использование: Позволяют повторно использовать существующие методы.
Интеграция с лямбда-выражениями: Отлично сочетаются с лямбда-выражениями и Stream API.
Минусы:
Ограниченная гибкость: Ссылки на методы подходят только для случаев, когда лямбда-выражение просто вызывает существующий метод.
Сложность отладки: Могут усложнить отладку, так как код становится менее явным.
Пример использования ссылок на методов в Stream API
Ссылки на методы часто используются в Stream API для упрощения кода.
Пример:
#Java #Training #Medium #Functional_programming #Method_References
Ссылки на методы (Method References) — это способ сослаться на метод, не вызывая его. Они были добавлены в Java 8 как часть поддержки лямбда-выражений. Ссылки на методы позволяют сделать код более компактным и читаемым, особенно когда лямбда-выражение просто вызывает уже существующий метод.
Синтаксис ссылки на метод:
ClassName::methodName
Типы ссылок на методы
В Java существует четыре типа ссылок на методы:
Ссылка на статический метод
Используется для ссылки на статический метод класса.
Пример:
interface MathOperation {
int operate(int a, int b);
}
public class Main {
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
// Ссылка на статический метод
MathOperation operation = Main::add;
System.out.println(operation.operate(5, 3)); // Вывод: 8
}
}
Ссылка на метод экземпляра
Используется для ссылки на метод конкретного объекта.
Пример:
interface Printer {
void print(String message);
}
public class Main {
public void printMessage(String message) {
System.out.println(message);
}
public static void main(String[] args) {
Main main = new Main();
// Ссылка на метод экземпляра
Printer printer = main::printMessage;
printer.print("Hello, World!"); // Вывод: Hello, World!
}
}
Ссылка на метод произвольного объекта
Используется для ссылки на метод объекта, который будет передан в качестве аргумента.
Пример:
interface StringOperation {
String operate(String str);
}
public class Main {
public static void main(String[] args) {
// Ссылка на метод произвольного объекта
StringOperation operation = String::toUpperCase;
System.out.println(operation.operate("hello")); // Вывод: HELLO
}
}
Ссылка на конструктор
Используется для ссылки на конструктор класса.
Пример:
interface Factory {
Object create();
}
public class Main {
public static void main(String[] args) {
// Ссылка на конструктор
Factory factory = String::new;
String str = (String) factory.create();
System.out.println(str.isEmpty()); // Вывод: true
}
}
Как это работает под капотом?
Ссылки на методы компилируются в объекты функциональных интерфейсов. Например, ссылка String::toUpperCase компилируется в реализацию функционального интерфейса, который вызывает метод toUpperCase на переданном объекте.
Пример:
Function<String, String> toUpperCase = String::toUpperCase;
System.out.println(toUpperCase.apply("hello")); // Вывод: HELLO
Здесь String::toUpperCase преобразуется в реализацию интерфейса Function, который принимает строку и возвращает её в верхнем регистре.
Плюсы и минусы ссылок на методы
Плюсы:
Упрощение кода: Ссылки на методы делают код более компактным и читаемым.
Повторное использование: Позволяют повторно использовать существующие методы.
Интеграция с лямбда-выражениями: Отлично сочетаются с лямбда-выражениями и Stream API.
Минусы:
Ограниченная гибкость: Ссылки на методы подходят только для случаев, когда лямбда-выражение просто вызывает существующий метод.
Сложность отладки: Могут усложнить отладку, так как код становится менее явным.
Пример использования ссылок на методов в Stream API
Ссылки на методы часто используются в Stream API для упрощения кода.
Пример:
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Использование ссылки на метод для вывода элементов
names.forEach(System.out::println);
// Использование ссылки на метод для преобразования строк
names.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
#Java #Training #Medium #Functional_programming #Method_References
Reflection API — Определение, назначение, преимущества и недостатки
Определение и назначение Reflection API
Reflection API — это мощный механизм в Java, который позволяет анализировать и изменять поведение классов, методов, полей и других элементов программы во время выполнения.
С помощью Reflection можно:
Получать информацию о классе (его методах, полях, конструкторах, аннотациях).
Создавать экземпляры классов.
Вызывать методы.
Получать и изменять значения полей, даже если они приватные.
Reflection API часто используется в:
Фреймворках (например, Spring для dependency injection).
Библиотеках сериализации (например, Jackson для работы с JSON).
Инструментах тестирования (например, JUnit для запуска тестов).
Преимущества использования Reflection
Гибкость: Позволяет работать с классами, о которых нет информации на этапе компиляции.
Динамичность: Можно создавать и использовать объекты, вызывать методы и изменять поля во время выполнения.
Расширяемость: Полезно для создания универсальных инструментов, таких как ORM, IoC-контейнеры и т.д.
Недостатки использования Reflection
Производительность: Reflection работает медленнее, чем прямой вызов методов или доступ к полям, так как требует дополнительных проверок и вызовов.
Безопасность: Reflection может обходить модификаторы доступа (например, получить доступ к приватным полям), что может нарушить инкапсуляцию.
Сложность отладки: Код с использованием Reflection сложнее отлаживать, так как многие ошибки возникают только во время выполнения.
#Java #Training #Medium #Reflection_API
Определение и назначение Reflection API
Reflection API — это мощный механизм в Java, который позволяет анализировать и изменять поведение классов, методов, полей и других элементов программы во время выполнения.
С помощью Reflection можно:
Получать информацию о классе (его методах, полях, конструкторах, аннотациях).
Создавать экземпляры классов.
Вызывать методы.
Получать и изменять значения полей, даже если они приватные.
Reflection API часто используется в:
Фреймворках (например, Spring для dependency injection).
Библиотеках сериализации (например, Jackson для работы с JSON).
Инструментах тестирования (например, JUnit для запуска тестов).
Преимущества использования Reflection
Гибкость: Позволяет работать с классами, о которых нет информации на этапе компиляции.
Динамичность: Можно создавать и использовать объекты, вызывать методы и изменять поля во время выполнения.
Расширяемость: Полезно для создания универсальных инструментов, таких как ORM, IoC-контейнеры и т.д.
Недостатки использования Reflection
Производительность: Reflection работает медленнее, чем прямой вызов методов или доступ к полям, так как требует дополнительных проверок и вызовов.
Безопасность: Reflection может обходить модификаторы доступа (например, получить доступ к приватным полям), что может нарушить инкапсуляцию.
Сложность отладки: Код с использованием Reflection сложнее отлаживать, так как многие ошибки возникают только во время выполнения.
#Java #Training #Medium #Reflection_API
Что выведет код?
#Tasks
import java.io.StringWriter;
public class Task040225 {
public static void main(String[] args) {
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.append(" World");
System.out.println(writer.toString().length());
}
}
#Tasks