Причина, по которой вам трудно понять значение функциональных интерфейсов, таких как те, что в 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…