Отличие binaryoperator от function java

Функциональные интерфейсы Java

Термин функциональный интерфейс был введен в Java 8. Это интерфейс, который содержит только один абстрактный (не реализованный) метод. Может содержать стандартные и статические, которые имеют реализацию, в дополнение к одному нереализованному.

public interface MyFunctionalInterface

Вышеуказанное содержит только один метод, и этот метод не имеет реализации.

Обычно интерфейс не содержит реализации методов, которые он объявляет, но он может содержать реализации в методах по умолчанию или в статических. Ниже приведен еще один пример с реализациями некоторых методов:

public interface MyFunctionalInterface2 < public void execute(); public default void print(String text) < System.out.println(text); >public static void print(String text, PrintWriter writer) throws IOException < writer.write(text); >>

Вышеупомянутый интерфейс все еще считается функциональным, поскольку он содержит только один не реализованный метод.

Реализация с помощью лямбда-выражения

MyFunctionalInterface lambda =() ->

Лямбда-выражение реализует единственный метод из интерфейса. Чтобы узнать, какой метод реализует лямбда-выражение, интерфейс может содержать только один не реализованный метод. Другими словами, он должен быть функциональным.

Встроенные функциональные интерфейсы

Есть разработанные виды для часто встречающихся вариантов использования, поэтому вам не нужно создавать свои собственные функциональные интерфейсы для каждого небольшого варианта использования.

Function

Интерфейс Function interface(java.util.function.Function) является одним из самых центральных функциональных интерфейсов. Представляет функцию (метод), которая принимает один параметр и возвращает одно значение. Вот как выглядит определение:

public interface Function

Интерфейс Function на самом деле содержит несколько дополнительных методов в дополнение к методам, перечисленным выше, но, поскольку все они поставляются с реализацией по умолчанию, вам не нужно реализовывать их.

Единственный метод, который необходимо реализовать для реализации интерфейса Function, – это apply(). Вот пример реализации функции:

public class AddThree implements Function < @Override public Long apply(Long aLong) < return aLong + 3; >>

В этой реализации функции реализован метод apply(), поэтому он принимает параметр Long в качестве параметра и возвращает Long. Вот пример использования вышеупомянутого класса AddThree:

Function adder = new AddThree(); Long result = adder.apply((long) 4); System.out.println(«result EnlighterJSRAW» data-enlighter-language=»java»>Function adder =(value) -> value + 3; Long resultLambda = adder.apply((long) 8); System.out.println(«resultLambda EnlighterJSRAW» data-enlighter-language=»java»>public interface Predicate

Читайте также:  Implementing classes in javascript

Интерфейс Predicate содержит больше методов, чем метод test(), но остальные являются стандартными или статическими, которые вам не нужно реализовывать.

Вы можете реализовать Predicate, используя класс, например так:

public class CheckForNull implements Predicate < @Override public boolean test(Object o) < return o != null; >>

Вы также можете реализовать Predicate, используя лямбда-выражение:

Predicate predicate =(value) -> value != null;

Эта лямбда-реализация Predicate фактически делает то же самое, что и реализация выше, использующая класс.

UnaryOperator

Интерфейс Java UnaryOperator представляет операцию, которая принимает один параметр и возвращает параметр того же типа:

UnaryOperator unaryOperator = (person) -> < person.name = "New Name"; return person; >;

Интерфейс UnaryOperator может использоваться для представления операции, которая принимает конкретный объект в качестве параметра, изменяет этот объект и возвращает его снова – возможно, как часть цепочки обработки функционального потока.

BinaryOperator

BinaryOperator – это функциональный интерфейс, представляющий операцию, которая принимает два параметра и возвращает одно значение. Оба параметра и тип возвращаемого значения должны быть одного типа. Полезен при реализации функций, которые суммируют, вычитают, делят, умножают и т. д. Два элемента одного типа и возвращают третий элемент того же типа.

BinaryOperator binaryOperator = (value1, value2) -> < value1.add(value2); return value1; >;

Supplier

Интерфейс Supplier – это функциональный интерфейс, представляющий функцию, которая предоставляет значение некоторых видов. Также можно рассматривать как фабричный интерфейс:

Supplier supplier =() -> new Integer((int)(Math.random() * 1000D));

Эта реализация Java Supplier возвращает новый экземпляр Integer со случайным значением от 0 до 1000.

Consumer

Consumer – это функциональный интерфейс, представляющий функцию, которая потребляет значение без возврата какого-либо значения. Реализация может распечатывать значение или записывать его в файл, или по сети и т. д. Реализация:

Consumer consumer =(value) -> System.out.println(value);

Эта реализация выводит значение, переданное ему в качестве параметра, в System.out.

Источник

Отличие binaryoperator от function java

В JDK 8 вместе с самой функциональностью лямбда-выражений также было добавлено некоторое количество встроенных функциональных интерфейсов, которые мы можем использовать в различных ситуациях и в различные API в рамках JDK 8. В частности, ряд далее рассматриваемых интерфейсов широко применяется в Stream API — новом прикладном интерфейсе для работы с данными. Рассмотрим основные из этих интерфейсов:

  • Predicate
  • Consumer
  • Function
  • Supplier
  • UnaryOperator
  • BinaryOperator
Читайте также:  Javascript дата dd mm yyyy

Predicate

Функциональный интерфейс Predicate проверяет соблюдение некоторого условия. Если оно соблюдается, то возвращается значение true . В качестве параметра лямбда-выражение принимает объект типа T:

public interface Predicate

import java.util.function.Predicate; public class LambdaApp < public static void main(String[] args) < PredicateisPositive = x -> x > 0; System.out.println(isPositive.test(5)); // true System.out.println(isPositive.test(-7)); // false > >

BinaryOperator

BinaryOperator принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T:

public interface BinaryOperator

import java.util.function.BinaryOperator; public class LambdaApp < public static void main(String[] args) < BinaryOperatormultiply = (x, y) -> x*y; System.out.println(multiply.apply(3, 5)); // 15 System.out.println(multiply.apply(10, -2)); // -20 > >

UnaryOperator

UnaryOperator принимает в качестве параметра объект типа T, выполняет над ними операции и возвращает результат операций в виде объекта типа T:

public interface UnaryOperator

import java.util.function.UnaryOperator; public class LambdaApp < public static void main(String[] args) < UnaryOperatorsquare = x -> x*x; System.out.println(square.apply(5)); // 25 > >

Function

Функциональный интерфейс Function представляет функцию перехода от объекта типа T к объекту типа R:

public interface Function

import java.util.function.Function; public class LambdaApp < public static void main(String[] args) < Functionconvert = x-> String.valueOf(x) + " долларов"; System.out.println(convert.apply(5)); // 5 долларов > >

Consumer

Consumer выполняет некоторое действие над объектом типа T, при этом ничего не возвращая:

public interface Consumer

import java.util.function.Consumer; public class LambdaApp < public static void main(String[] args) < Consumerprinter = x-> System.out.printf("%d долларов \n", x); printer.accept(600); // 600 долларов > >

Supplier

Supplier не принимает никаких аргументов, но должен возвращать объект типа T:

public interface Supplier

import java.util.Scanner; import java.util.function.Supplier; public class LambdaApp < public static void main(String[] args) < SupplieruserFactory = ()->< Scanner in = new Scanner(System.in); System.out.println("Введите имя: "); String name = in.nextLine(); return new User(name); >; User user1 = userFactory.get(); User user2 = userFactory.get(); System.out.println("Имя user1: " + user1.getName()); System.out.println("Имя user2: " + user2.getName()); > > class User < private String name; String getName()< return name; >User(String n) < this.name=n; >>
Введите имя: Том Введите имя: Сэм Имя user1: Том Имя user2: Сэм

Источник

Читайте также:  Java http сервер обработка запросов

Блок Примитивные типы

Единственный в мире Музей Смайликов

Самая яркая достопримечательность Крыма

Скачать 6.67 Mb.

  1. Может ли функциональный интерфейс содержать что-то кроме абстрактного метода? Что такое default методы?

default – реализованные методы в функциональных интерфейсах. При наследовании интерфейса можно переопределить эти методы или же оставить всё как есть (оставить логику по умолчанию).

Статические методы в интерфейсе помогают обеспечивать безопасность, не позволяя классам, которые реализуют интерфейс, переопределить их.

Consumer (с англ. — “потребитель”) — принимает в качестве входного аргумента объект типа T, совершает некоторые действия, но при этом ничего не возвращает. Содержит метод void accept(T t).

Supplier (с англ. — поставщик) — не принимает никаких аргументов, но возвращает некоторый объект типа T. Содержит метод T get().

Function—принимает аргумент T и приводит его к объекту типа R, который и возвращается как результат. Содержит метод R apply(T t); Может возвращать и объект того же типа, какой принимает.

UnaryOperator — принимает в качестве параметра объект типа T, выполняет над ним некоторые операции и возвращает результат операций в виде объекта того же типа T. Содержит метод T apply(T t).

BinaryOperator — принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T. Содержит метод T apply(T t1, T t2).

Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например, при сортировках).

— воспользоваться ссылкой на метод;

BinaryOperator это разновидность Function, в которых входные и выходные обобщенные параметры должны совпадать. Если заглянуть в пакет java.util.function, то можно заметить, что UnaryOperator расширяет Function, а BinaryOperator расширяет BiFunction.

Императивное программирование — это парадигма программирования, в которой задаётся последовательность действий, необходимых для получения результата.

Такой стиль, в котором вы описываете, какой именно результат вам нужен. И получатель такого сообщения уже сам разбирается, какие шаги для этого надо предпринять.

Источник

Оцените статью