supplier java что это
Функциональные интерфейсы Java
Термин функциональный интерфейс был введен в Java 8. Это интерфейс, который содержит только один абстрактный (не реализованный) метод. Может содержать стандартные и статические, которые имеют реализацию, в дополнение к одному нереализованному.
Вышеуказанное содержит только один метод, и этот метод не имеет реализации.
Обычно интерфейс не содержит реализации методов, которые он объявляет, но он может содержать реализации в методах по умолчанию или в статических. Ниже приведен еще один пример с реализациями некоторых методов:
Вышеупомянутый интерфейс все еще считается функциональным, поскольку он содержит только один не реализованный метод.
Реализация с помощью лямбда-выражения
Лямбда-выражение реализует единственный метод из интерфейса. Чтобы узнать, какой метод реализует лямбда-выражение, интерфейс может содержать только один не реализованный метод. Другими словами, он должен быть функциональным.
Встроенные функциональные интерфейсы
Есть разработанные виды для часто встречающихся вариантов использования, поэтому вам не нужно создавать свои собственные функциональные интерфейсы для каждого небольшого варианта использования.
Function
Интерфейс Function interface(java.util.function.Function) является одним из самых центральных функциональных интерфейсов. Представляет функцию (метод), которая принимает один параметр и возвращает одно значение. Вот как выглядит определение:
Интерфейс Function на самом деле содержит несколько дополнительных методов в дополнение к методам, перечисленным выше, но, поскольку все они поставляются с реализацией по умолчанию, вам не нужно реализовывать их.
Единственный метод, который необходимо реализовать для реализации интерфейса Function, – это apply(). Вот пример реализации функции:
В этой реализации функции реализован метод apply(), поэтому он принимает параметр Long в качестве параметра и возвращает Long. Вот пример использования вышеупомянутого класса AddThree:
Вы также можете реализовать Function с помощью лямбда-выражения:
Как видите, реализация Function теперь встроена в объявление переменной adderLambda, а не в отдельный класс. Это немного короче, плюс мы можем видеть непосредственно в приведенном выше коде, что он делает.
Predicate
Интерфейс Java Predicate, java.util.function.Predicate, представляет простую функцию, которая принимает одно значение в качестве параметра и возвращает true или false:
Интерфейс Predicate содержит больше методов, чем метод test(), но остальные являются стандартными или статическими, которые вам не нужно реализовывать.
Вы можете реализовать Predicate, используя класс, например так:
Вы также можете реализовать Predicate, используя лямбда-выражение:
Эта лямбда-реализация Predicate фактически делает то же самое, что и реализация выше, использующая класс.
UnaryOperator
Интерфейс Java UnaryOperator представляет операцию, которая принимает один параметр и возвращает параметр того же типа:
Интерфейс UnaryOperator может использоваться для представления операции, которая принимает конкретный объект в качестве параметра, изменяет этот объект и возвращает его снова – возможно, как часть цепочки обработки функционального потока.
BinaryOperator
BinaryOperator – это функциональный интерфейс, представляющий операцию, которая принимает два параметра и возвращает одно значение. Оба параметра и тип возвращаемого значения должны быть одного типа. Полезен при реализации функций, которые суммируют, вычитают, делят, умножают и т. д. Два элемента одного типа и возвращают третий элемент того же типа.
Supplier
Интерфейс Supplier – это функциональный интерфейс, представляющий функцию, которая предоставляет значение некоторых видов. Также можно рассматривать как фабричный интерфейс:
Эта реализация Java Supplier возвращает новый экземпляр Integer со случайным значением от 0 до 1000.
Consumer
Consumer – это функциональный интерфейс, представляющий функцию, которая потребляет значение без возврата какого-либо значения. Реализация может распечатывать значение или записывать его в файл, или по сети и т. д. Реализация:
Java 8 объяснение поставщика и потребителя для непрофессионала
как программист не-Java, изучающий Java, я читаю о Supplier и Consumer интерфейсов на данный момент. И я не могу разобраться в их значении. Когда и почему вы будете использовать эти интерфейсы? Может кто-нибудь дать мне простой пример непрофессионала этого. я нахожу примеры Doc недостаточно краткими для моего понимания.
7 ответов
таким образом, в терминах непрофессионала поставщик-это метод, который возвращает некоторое значение (как в его возвращаемом значении). В то время как потребитель-это метод, который потребляет некоторое значение (как в аргументе метода) и выполняет некоторые операции над ними.
те превратятся во что-то вроде этого:
Что касается использования, самым основным примером будет: Stream#forEach(Consumer) метод. Это требует Потребитель, который потребляет элемент из потока, на котором вы выполняете итерацию, и выполняет некоторые действия над каждым из них. Вероятно, распечатать их.
причина у вас возникли трудности с пониманием значения функциональных интерфейсов, таких как java.util.function то, что интерфейсы, определенные здесь, не имеют никакого значения! Они присутствуют прежде всего для представления структура, а не семантика.
Function не имеет смысла в отрыве. Однако, в java.util.Map API, есть следующее:
(подстановочные знаки для краткость)
Ах, это использование Function является «функцией отображения». Что это значит? В этом контексте, если key еще не присутствует на карте, функция отображения вызывается и передается ключ и, как ожидается, произведет значение, и результирующая пара ключ-значение вставляется в карту.
поэтому вы не можете посмотреть спецификацию для Function (или любой другой функциональный интерфейс, если на то пошло) и попытаться понять, что они означают. Ты должен посмотрите, где они используются в других API, чтобы понять, что они означают, и это значение применимо только к этому контексту.
ссылка метода класса на геттер также является функцией.
почему потребитель / поставщик / другие функциональные интерфейсы определены в java.утиль.пакет функций: потребитель и поставщик-это два, среди многих, встроенных функциональных интерфейса, предоставляемых в Java 8. Цель всех этих встроенных функциональных интерфейсов-предоставить готовый «шаблон» для функциональных интерфейсов, имеющих общие дескрипторы функций(сигнатуры/определения функциональных методов).
допустим, у нас есть необходимое для преобразования типа T в другой тип R. Если мы пройдем!—7—>любой функция, определенная как это в качестве параметра метода, тогда этот метод должен будет определить функциональный интерфейс, функциональный / абстрактный метод которого принимает параметр типа T в качестве входного и дает параметр типа R в качестве выходного. Теперь может быть много сценариев, подобных этому, и программист(ы) в конечном итоге определит несколько функциональных интерфейсов для своих нужд. Чтобы избежать такого сценария, простота программирования и общих стандартов в использовании определены функциональные интерфейсы, набор встроенных функциональных интерфейсов, таких как предикат, функция, потребитель и поставщик.
везде, где вам нужна функция, которая возвращает что-то, скажем, целое число, но не выводит экземпляр поставщика.
1. Смысл
2. Различия
потребитель: что-то берет, что-то делает, ничего не возвращает: void accept(T t)
поставщик: принимает ничего, возвращает что-то : T get() (реверс потребителя, в основном универсальный метод «геттера»)
3. Использование
поставщик: оберните повторяющийся код, например, время выполнения кода
в непрофессиональных терминах,
поставщик будет поставлять данные, но не потребляя никаких данных. В терминах программирования Метод, который не принимает никаких аргументов, но возвращает значение. Он используется для генерации новых значений.
потребитель будет потреблять информацию, но не возвращает никаких данных. С точки зрения программирования Метод, который принимает несколько аргументов и не возвращает никакого значения.
вы можете легко понять с демонстрацией кода.
Зачем использовать `java.util.function.supplier`, когда можно просто вызвать метод?
У меня вопрос, если бы в приведенном выше примере я мог бы сделать что-то так просто, как:
Зачем использовать интерфейс поставщика, если все, что он делает, это вызывает метод, не принимая никаких параметров.
5 ответов
Предположим, у вас есть параметры, хранящиеся в базе данных, которые вы хотите поддерживать постоянными во всем приложении
Это значение будет инициализировано один раз и не изменится до повторного развертывания. При этом, если вместо этого вы используете поставщика:
Вы можете использовать поставщика в фабричном классе на основе карты
Поставщик добавляет еще один уровень косвенности.
Учитывая, что «Все проблемы в области компьютерных наук могут быть решены с помощью другого уровня косвенности», вполне вероятно, что есть некоторые проблемы, которые можно решить с помощью поставщика.
Остерегайтесь, однако, следствия «. за исключением проблемы слишком большого количества уровней косвенности».
Иными словами: недоверие к любому «образцу» или «лучшей практике», которые не начинаются с объяснения проблемы (ваш вопрос показывает, что вы на самом деле испытываете недоверие, поэтому просто продолжайте задавать подобные вопросы).
Рассмотрим, например, этот пример:
Конечно, следует избегать побочных эффектов везде, где это возможно, и это всего лишь игрушечный пример, но он показывает потенциальное место, где можно использовать поставщика.
Я думаю, что Optional может быть идеальным примером. Рассмотрим следующий фрагмент:
Вы получаете продукт, который может быть нулевым. Чтобы определить firstProduct, java должен будет вызвать выражение в методе orElse, поэтому независимо от того, является ли продукт нулевым или нет, вам всегда нужно определять значение, которое будет возвращено в случае, если продукт равен нулю.
Чтобы определить, что база данных secondProduct не должна запрашиваться в случае, если товар не равен нулю, потому что вы передаете поставщика, который будет вызываться только в том случае, если товар равен нулю.
Understanding Java 8’s Consumer, Supplier, Predicate and Function
Functional programming in Java in a better way.
J ava has introduced functional programming support in Java release version 8. This specific release has also introduced several new concepts notably lambda expressions, method reference and a plethora of functional interfaces. While discussing functional interfaces, there are few functional interfaces namely Consumer, Supplier, Predicate and Functions are most crucial. In this article, we will talk about these interfaces.
Consumer
A Consumer is a functional interface that accepts a single input and returns no output. In layman’s language, as the name suggests the implementation of this interface consumes the input supplied to it. Consumer interface has two methods:
The accept method is the Single Abstract Method (SAM) which accepts a single argument of type T. Whereas, the other one andThen is a default method used for composition.
Following is an example of a consumer interface. We have created a consumer implementation that consumes a String and then prints it. The forEach method accepts consumer interface implementation.
In the following example, we demonstrate the usage of composing multiple consumer implementations to make a chain of consumers. In this specific example, we have created two consumers; one converts a list of items into upper case Strings and the other one prints the uppercased string.
Consumer interface has specific implementation types for integer, double and long types with IntConsumer, DoubleConsumer, and LongConsumer as shown below:
Supplier
A Supplier is a simple interface which indicates that this implementation is a supplier of results. This interface, however, does not enforce any restrictions that supplier implementation needs to return a different result on each invocation.
The supplier has only one method get() and does not have any other default and static methods.
The supplier interface has its primitive variants such as IntSupplier, DoubleSupplier and so on as shown below. Note that the method name is get() for the generic supplier interface. However, for the primitive variants, it is as per the primitive type.
One of the primary usage of this interface to enable deferred execution. This means delaying the execution until it is needed. For example, Optional class has a method named orElseGet. This method is triggered if optional does not have data. This is demonstrated below:
Predicate
A Predicate interface represents a boolean-valued-function of an argument. This is mainly used to filter data from a Java Stream. The filter method of a stream accepts a predicate to filter the data and return a new stream satisfying the predicate. A predicate has a test() method which accepts an argument and returns a boolean value.
In the above example, we have created a predicate which tests the names that start with S. This predicate is supplied to a stream.
Predicate also provides a few default and static method for composition and other purposes:
Following example demonstrates to use and method to compose predicates with multiple predicates.
Function
A Function interface is more of a generic one that takes one argument and produces a result. This has a Single Abstract Method (SAM) apply which accepts an argument of a type T and produces a result of type R. One of the common use cases of this interface is Stream.map method. This is shown as below:
Wrapping Up
The introduction of functional programming has introduced a new paradigm in Java language. And, Consumer, Supplier, Predicate and Function interfaces play a critical role in the way Java has enabled it. Mastering these interfaces and related primitive variants certainly help to write better functional code.
Java 8 Consumer and Supplier
Introduction
The Consumer and Supplier interfaces are a couple of Functional Interfaces that belong to the new Java 8 java.util.function package. As the package name states, these interfaces are meant to be used together with the new functional Java 8 features.
A complete list of the package interfaces and their descriptions may be found here: java.util.function (Java Platform SE 8).
Supplier
Suppliers represent a function that accepts no arguments and produce a result of some arbitrary type.
Suppliers may reference constructor methods:
Suppliers may also reference static methods:
Instance methods are also available to be referenced by suppliers:
Consumer
Consumers represent a function that accepts a single argument of an arbitrary type and produce no result:
Consumers may also be applied to streams of data in order to execute some given action against every stream element:
Streams will be covered in a later article.
Asynchronous processing
Even though Java 8 Consumers and Suppliers were included in order to supply functional features, they may remind us of the typical Publisher-Subscriber asynchronous processing architecture.
Java already provides a complete infrastructure in order to implement asynchronous processing, but one could also craft something like the following using Consumers and Suppliers (even if it is just for curiosity):
We use a LinkedBlockingQueue as the underlying data structure that holds the items to be processed since it is already synchronized internally.
The Supplier is responsible for taking items from the queue and the Consumer is responsible for process those items.
We left the SupplierConsumer class generic enough so it’s just a matter of defining how the Supplier will fetch data that will be later passed to the consumer for processing.