Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Бі-версії Функціональних Інтерфейсів | Основи Та Функціональні Можливості Stream API
Stream API

bookБі-версії Функціональних Інтерфейсів

У 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

Main.java

copy
1234567891011121314151617
package 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

Main.java

copy
1234567891011121314151617181920212223242526
package 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

Main.java

copy
1234567891011121314151617
package 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. Який інтерфейс використовується для перевірки логічної умови з двома аргументами?

question mark

Який метод є основним у інтерфейсі BiFunction<T, U, R>?

Select the correct answer

question mark

Що повертає метод accept(T t, U u) інтерфейсу BiConsumer<T, U>?

Select the correct answer

question mark

Який інтерфейс використовується для перевірки логічної умови з двома аргументами?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 13

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

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

bookБі-версії Функціональних Інтерфейсів

Свайпніть щоб показати меню

У 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

Main.java

copy
1234567891011121314151617
package 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

Main.java

copy
1234567891011121314151617181920212223242526
package 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

Main.java

copy
1234567891011121314151617
package 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. Який інтерфейс використовується для перевірки логічної умови з двома аргументами?

question mark

Який метод є основним у інтерфейсі BiFunction<T, U, R>?

Select the correct answer

question mark

Що повертає метод accept(T t, U u) інтерфейсу BiConsumer<T, U>?

Select the correct answer

question mark

Який інтерфейс використовується для перевірки логічної умови з двома аргументами?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 13
some-alt