Причина, з якою вам важко зрозуміти значення функціональних інтерфейсів, таких як ті java.util.function
, що є, полягає в тому, що визначені тут інтерфейси не мають жодного значення! Вони присутні насамперед для представлення структури , а не семантики .
Це нетипово для більшості API Java. Типовий Java API, такий як клас або інтерфейс, має значення, і ви можете розробити розумову модель того, що вона представляє, і використовувати її для розуміння операцій над нею. Розглянемо java.util.List
для прикладу. A List
- контейнер інших об'єктів. Вони мають послідовність та індекс. Кількість об'єктів, що містяться у списку, повертається size()
. Кожен об’єкт має індекс в діапазоні 0..розмір-1 (включно). Об'єкт з індексом i можна отримати за допомогою виклику list.get(i)
. І так далі.
Функціональні інтерфейси в java.util.function
не мають такого значення. Натомість вони є інтерфейсами, які просто представляють структуру функції, наприклад, кількість аргументів, кількість повернутих значень та (іноді), чи є аргумент чи повернене значення примітивним. Таким чином , ми маємо щось подібне , Function<T,R>
яке представляє собою функцію , яка приймає один аргумент типу T і повертає значення типу R . Це воно. Що робить ця функція? Що ж, він може робити все, що завгодно, якщо він приймає один аргумент і повертає одне значення. Ось чому специфікація для Function<T,R>
трохи більше, ніж "Представляє функцію, яка приймає один аргумент і дає результат".
Очевидно, що коли ми пишемо код, він має значення, і це значення має звідкись походити. У випадку функціональних інтерфейсів значення походить від контексту, в якому вони використовуються. Інтерфейс Function<T,R>
не має окремого значення. Однак в java.util.Map<K,V>
API є таке:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(узагальнюючі символи висловлені для стислості)
Ах, це використання Function
є як "функція відображення". Що це робить? У цьому контексті, якщо key
вона ще не присутня на карті, викликається функція відображення, якій вручається ключ і, як очікується, створить значення, а отримана пара ключ-значення вставляється на карту.
Отже, ви не можете дивитись на специфікацію Function
(або будь-який інший функціональний інтерфейс), а також намагатися розпізнати, що вони означають. Ви повинні подивитися, де вони використовуються в інших API, щоб зрозуміти, що вони означають, і це значення стосується лише цього контексту.
Consumer
іSupplier
Ви можете також шукати підручник дляConsumer
...