Бі-версії Функціональних Інтерфейсів
У Java існує кілька бі-версій функціональних інтерфейсів, які працюють із двома аргументами. Ці інтерфейси надають зручні шаблони для виконання різних операцій із парою вхідних даних, незалежно від того, чи це обчислення результату, виконання дії або перевірка умови.
Вони спрощують обробку складних сценаріїв, коли потрібно працювати з двома параметрами одночасно.
Наприклад, замість написання об'ємного коду з кількома вкладеними викликами, можна скористатися лаконічними інтерфейсами, які надають готові методи для реалізації ключових функціональних можливостей.
BiFunction<T, U, R>
BiFunction — це функціональний інтерфейс, який приймає два вхідних аргументи типів T та U і повертає результат типу R.
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
BiFunction є ідеальним для завдань, де потрібно обробити два значення та повернути похідний результат, наприклад, для обчислень, перетворень або комбінування даних.
Наприклад, якщо потрібно обчислити загальну вартість товарів на складі шляхом множення кількості на ціну за одиницю:
Main.java
1234567891011121314151617package com.example; import java.util.function.BiFunction; public class Main { public static void main(String[] args) { // `BiFunction` to calculate total cost BiFunction<Integer, Double, Double> calculateTotalCost = (quantity, pricePerUnit) -> quantity * pricePerUnit; // Example usage int quantity = 50; double pricePerUnit = 19.99; double totalCost = calculateTotalCost.apply(quantity, pricePerUnit); System.out.println("Total cost: $" + totalCost); } }
У цьому прикладі BiFunction<Integer, Double, Double> приймає два аргументи: quantity та pricePerUnit (ціна за одиницю) і повертає результат — загальну вартість як значення типу Double. Метод apply() виконує зазначену операцію, поєднуючи функціональний інтерфейс із логікою множення.
BiConsumer<T, U>
BiConsumer — це функціональний інтерфейс, який приймає два аргументи типів T та U, але не повертає результату.
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}
Використовується для виконання дій над двома об'єктами, таких як логування, відображення інформації або збереження даних.
Наприклад, створимо функціональний інтерфейс, який приймає ім'я працівника та зарплату, форматує ці дані та виводить їх у консоль:
Main.java
1234567891011121314151617181920212223242526package com.example; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; public class Main { public static void main(String[] args) { // `BiConsumer` for formatted output of employee details BiConsumer<String, Double> printEmployeeDetails = (name, salary) -> { System.out.printf("Employee: %-15s | Salary: $%.2f%n", name, salary); }; // Collection of employees with their salaries Map<String, Double> employeeData = new HashMap<>(); employeeData.put("John Smith", 75000.0); employeeData.put("Mary Johnson", 82000.0); employeeData.put("Robert Brown", 64000.0); employeeData.put("Emily Davis", 91000.0); // Print details of each employee System.out.println("Employee Salary Report:"); System.out.println("-----------------------------------"); employeeData.forEach(printEmployeeDetails); } }
У цьому прикладі BiConsumer<String, Double> використовується для обробки імені працівника та зарплати, виводячи дані у консоль у відформатованому вигляді.
Метод forEach() колекції Map передає кожну пару ключ-значення до BiConsumer, який виконує зазначену дію для всіх працівників.
BiPredicate<T, U>
BiPredicate — це функціональний інтерфейс, який приймає два аргументи типів T та U і повертає булевий результат.
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
}
Використовується для перевірки умов, де результатом є булеве значення (true або false), на основі аналізу двох вхідних значень.
Наприклад, перевірка, чи довжина рядка більша за задане число:
Main.java
1234567891011121314151617package com.example; import java.util.function.BiPredicate; public class Main { public static void main(String[] args) { // `BiPredicate` to check if string length is greater than given number BiPredicate<String, Integer> isStringLongerThan = (str, length) -> str.length() > length; // Example usage String text = "Sample string"; int minLength = 10; boolean result = isStringLongerThan.test(text, minLength); System.out.println("String is longer than " + minLength + " characters: " + result); } }
У цьому прикладі BiPredicate<String, Integer> приймає два аргументи: рядок str та число length, що позначає мінімальну довжину. Метод test() перевіряє умову, повертаючи true, якщо довжина рядка більша за вказане число, або false в іншому випадку.
1. Який метод є основним у інтерфейсі BiFunction<T, U, R>?
2. Що повертає метод accept(T t, U u) інтерфейсу BiConsumer<T, U>?
3. Який інтерфейс використовується для перевірки логічної умови з двома аргументами?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you give examples of how to use these bi-functional interfaces in Java?
What are some common use cases for BiFunction, BiConsumer, and BiPredicate?
How do these bi-interfaces differ from their single-argument counterparts?
Awesome!
Completion rate improved to 2.33
Бі-версії Функціональних Інтерфейсів
Свайпніть щоб показати меню
У Java існує кілька бі-версій функціональних інтерфейсів, які працюють із двома аргументами. Ці інтерфейси надають зручні шаблони для виконання різних операцій із парою вхідних даних, незалежно від того, чи це обчислення результату, виконання дії або перевірка умови.
Вони спрощують обробку складних сценаріїв, коли потрібно працювати з двома параметрами одночасно.
Наприклад, замість написання об'ємного коду з кількома вкладеними викликами, можна скористатися лаконічними інтерфейсами, які надають готові методи для реалізації ключових функціональних можливостей.
BiFunction<T, U, R>
BiFunction — це функціональний інтерфейс, який приймає два вхідних аргументи типів T та U і повертає результат типу R.
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
BiFunction є ідеальним для завдань, де потрібно обробити два значення та повернути похідний результат, наприклад, для обчислень, перетворень або комбінування даних.
Наприклад, якщо потрібно обчислити загальну вартість товарів на складі шляхом множення кількості на ціну за одиницю:
Main.java
1234567891011121314151617package com.example; import java.util.function.BiFunction; public class Main { public static void main(String[] args) { // `BiFunction` to calculate total cost BiFunction<Integer, Double, Double> calculateTotalCost = (quantity, pricePerUnit) -> quantity * pricePerUnit; // Example usage int quantity = 50; double pricePerUnit = 19.99; double totalCost = calculateTotalCost.apply(quantity, pricePerUnit); System.out.println("Total cost: $" + totalCost); } }
У цьому прикладі BiFunction<Integer, Double, Double> приймає два аргументи: quantity та pricePerUnit (ціна за одиницю) і повертає результат — загальну вартість як значення типу Double. Метод apply() виконує зазначену операцію, поєднуючи функціональний інтерфейс із логікою множення.
BiConsumer<T, U>
BiConsumer — це функціональний інтерфейс, який приймає два аргументи типів T та U, але не повертає результату.
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}
Використовується для виконання дій над двома об'єктами, таких як логування, відображення інформації або збереження даних.
Наприклад, створимо функціональний інтерфейс, який приймає ім'я працівника та зарплату, форматує ці дані та виводить їх у консоль:
Main.java
1234567891011121314151617181920212223242526package com.example; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; public class Main { public static void main(String[] args) { // `BiConsumer` for formatted output of employee details BiConsumer<String, Double> printEmployeeDetails = (name, salary) -> { System.out.printf("Employee: %-15s | Salary: $%.2f%n", name, salary); }; // Collection of employees with their salaries Map<String, Double> employeeData = new HashMap<>(); employeeData.put("John Smith", 75000.0); employeeData.put("Mary Johnson", 82000.0); employeeData.put("Robert Brown", 64000.0); employeeData.put("Emily Davis", 91000.0); // Print details of each employee System.out.println("Employee Salary Report:"); System.out.println("-----------------------------------"); employeeData.forEach(printEmployeeDetails); } }
У цьому прикладі BiConsumer<String, Double> використовується для обробки імені працівника та зарплати, виводячи дані у консоль у відформатованому вигляді.
Метод forEach() колекції Map передає кожну пару ключ-значення до BiConsumer, який виконує зазначену дію для всіх працівників.
BiPredicate<T, U>
BiPredicate — це функціональний інтерфейс, який приймає два аргументи типів T та U і повертає булевий результат.
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
}
Використовується для перевірки умов, де результатом є булеве значення (true або false), на основі аналізу двох вхідних значень.
Наприклад, перевірка, чи довжина рядка більша за задане число:
Main.java
1234567891011121314151617package com.example; import java.util.function.BiPredicate; public class Main { public static void main(String[] args) { // `BiPredicate` to check if string length is greater than given number BiPredicate<String, Integer> isStringLongerThan = (str, length) -> str.length() > length; // Example usage String text = "Sample string"; int minLength = 10; boolean result = isStringLongerThan.test(text, minLength); System.out.println("String is longer than " + minLength + " characters: " + result); } }
У цьому прикладі BiPredicate<String, Integer> приймає два аргументи: рядок str та число length, що позначає мінімальну довжину. Метод test() перевіряє умову, повертаючи true, якщо довжина рядка більша за вказане число, або false в іншому випадку.
1. Який метод є основним у інтерфейсі BiFunction<T, U, R>?
2. Що повертає метод accept(T t, U u) інтерфейсу BiConsumer<T, U>?
3. Який інтерфейс використовується для перевірки логічної умови з двома аргументами?
Дякуємо за ваш відгук!