Predicate java что это
Перейти к содержимому

Predicate java что это

  • автор:

Java 8. Разбор интерфейса Predicate

Все и так знают, что такое Predicate. Это функциональный интрефейс, т.е. имеет один абстрактный метод test, который
принимет T, а возвращает boolean. Но не все знают, что есть default методы and, or, negate.
Рассмотрим пример:
POJO класс User:

public class User < private String name; private int age; public User(String name, int age) < this.name = name; this.age = age; >public String getName() < return name; >public int getAge() < return age; >@Override public String toString() < return "User'; > >

Ну и класс UserCollections, который служит для коллекции объектов

import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.stream.Stream; public class UserCollections < public Streamusers() < return getUsers().stream(); >public List getUsers() < return Arrays.asList(new User("Hancock" , 20), new User("Porter", 35), new User("Wesley", 30), new User("Adamson", 45), new User("Austin", 21)); >public static Predicate olderThan(int older) < return u ->u.getAge() > older; > public static Predicate youngerThan(int younger) < return u ->u.getAge() < younger; >public static Predicate sameAge(int sameAge) < return u ->u.getAge() == sameAge; > public static Predicate sameName(String name) < return u ->u.getName().equalsIgnoreCase(name); > public static Predicate containsName(String name) < return u ->u.getName().contains(name); > >

Ну и примеры:
1) and

UserCollections userCol = new UserCollections(); List users = userCol.users().filter(UserCollections.containsName("a").and(UserCollections.youngerThan(48).and(UserCollections.olderThan(30)))).collect(Collectors.toList());

Тут мы ищем пользователей по имени, которое содержит a, и старше 30 и младше 48.
Нужно упростить понимаение использовав static импорт в Idea (Alt + Enter и выбрать ‘use static import for’)

UserCollections userCol = new UserCollections(); List users = userCol.users().filter(containsName("a").and(youngerThan(48).and(olderThan(30)))).collect(toList());

Да, так более читаемо

List users = userCol.users().filter(olderThan(40).or(youngerThan(25))).collect(toList());
List users = userCol.users().filter(olderThan(30).negate()).collect(toList());

Почему выводится User ? Т.к. >30, отрицание — меньше или равно 30.

Функциональные интерфейсы в Java 8 → Consumer, Supplier, Predicate и Function. Что к чему и зачем нужны

Java представила поддержку функционального программирования в выпуске Java версии 8. Этот конкретный выпуск также представил несколько новых концепций, в частности лямбда-выражения, ссылки на методы и множество функциональных интерфейсов. При обсуждении последних, есть несколько функциональных интерфейсов, а именно Потребитель (Consumer), Поставщик (Supplier), Предикат (Predicat) и Функция (Function), которые являются наиболее важными. В этой статье мы о них и поговорим.

Consumer (потребитель)

Consumer — это функциональный интерфейс, который принимает один параметр на вход и не возвращает никаких выходных данных. На языке непрофессионала, как следует из названия, реализация этого интерфейса потребляет вводимые данные. Пользовательский интерфейс имеет два метода:

void accept(T t); default Consumer andThen(Consumer after);

Метод accept является единым абстрактным методом (SAM), который принимает один аргумент типа T. Тогда как другой метод andThen является методом по умолчанию и используется для композиции.

Ниже приведен пример интерфейса consumer. Мы создали потребительскую реализацию, которая использует строку, а затем просто выводит ее на экран. Метод forEach принимает реализацию потребительского интерфейса.

public void whenNamesPresentConsumeAll() < ConsumerprintConsumer = t -> System.out.println(t); Stream cities = Stream.of("Sydney", "Dhaka", "New York", "London"); cities.forEach(printConsumer); >

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

public void whenNamesPresentUseBothConsumer() < Listcities = Arrays.asList("Sydney", "Dhaka", "London"); Consumer upperCaseConsumer = list -> < for(int i=0; i< list.size(); i++)< list.set(i, list.get(i).toUpperCase()); >>; Consumer printConsumer = list -> list.stream() .forEach(System.out::println); upperCaseConsumer.andThen(printConsumer).accept(cities); >

Интерфейс Consumer имеет специфические типы реализаций для типов integer, double и long -> IntConsumer, DoubleConsumer и LongConsumer, как показано ниже:

IntConsumer void accept(int x); DoubleConsumer void accept(double x); LongConsumer void accept(long x);

Supplier (поставщик)

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

У поставщика есть только один метод get() и нет никаких других методов по умолчанию или статических методов.

public void supplier() < SupplierdoubleSupplier1 = () -> Math.random(); DoubleSupplier doubleSupplier2 = Math::random; System.out.println(doubleSupplier1.get()); System.out.println(doubleSupplier2.getAsDouble()); >

Интерфейс поставщик имеет свои примитивные варианты, такие как IntSupplier, DoubleSupplier и т. д., как показано ниже. Обратите внимание, что имя метода — get() используется для универсального интерфейса поставщика. Однако для примитивных вариантов этот метод соответствует примитивному типу.

IntSupplier int getAsInt(); DoubleSupplier double getAsDouble(); LongSupplier long getAsLong(); BooleanSupplier boolean getAsBoolean();

Одно из основных применений этого интерфейса это использование для включения отложенного выполнения. Это означает отсрочку выполнения до тех пор, пока оно не понадобится. Например, в классе Optional есть метод orElseGet. Этот метод срабатывает, если у option нет данных. Это показано ниже:

public void supplierWithOptional() < SupplierdoubleSupplier = () -> Math.random(); Optional optionalDouble = Optional.empty(); System.out.println(optionalDouble.orElseGet(doubleSupplier)); >

Predicate (предикат)

Интерфейс Predicate представляет собой логическую функцию аргумента. Он в основном используется для фильтрации данных из потока (stream) Java. Метод фильтра потока принимает предикат для фильтрации данных и возврата нового потока, удовлетворяющего предикату. У предиката есть метод test(), который принимает аргумент и возвращает логическое значение.

public void testPredicate() < Listnames = Arrays.asList("Smith", "Samueal", "Catley", "Sie"); Predicate nameStartsWithS = str -> str.startsWith("S"); names.stream().filter(nameStartsWithS).forEach(System.out::println); >

В приведенном выше примере мы создали предикат, который проверяет имена, начинающиеся с S. Этот предикат передается потоку.

Predicate также предоставляет несколько стандартных и статических методов для композиции и других целей:

default Predicate and(Predicate other); default Predicate or(Predicate other); static Predicate isEquals(Object targetRef); default Predicate negate();

В следующем примере демонстрируется использование и метод для составления цепочки предикатов.

public void testPredicateAndComposition() < Listnames = Arrays.asList("Smith", "Samueal", "Catley", "Sie"); Predicate startPredicate = str -> str.startsWith("S"); Predicate lengthPredicate = str -> str.length() >= 5; names.stream() .filter(startPredicate.and(lengthPredicate)) .forEach(System.out::println); >

Function (функция)

Интерфейс Function — это более общий интерфейс, который принимает один аргумент и выдает результат. В нем применяется единый абстрактный метод (SAM), который принимает аргумент типа T и выдает результат типа R. Одним из распространенных вариантов использования этого интерфейса является метод Stream.map. Пример использования показан ниже:

public void testFunctions() < Listnames = Arrays.asList("Smith", "Gourav", "John", "Catania"); Function nameMappingFunction = String::length; List nameLength = names.stream() .map(nameMappingFunction).collect(Collectors.toList()); System.out.println(nameLength); >

Подведем итоги

Введение функционального программирования представило новую парадигму языка Java. И интерфейсы Consumer, Supplier, Predicate и Function играют решающую роль в том, как это реализовано в Java. Освоение этих интерфейсов и связанных с ними примитивных вариантов, безусловно, помогает писать более качественный функциональный код.

Predicate java что это

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

  • Predicate
  • Consumer
  • Function
  • Supplier
  • UnaryOperator
  • BinaryOperator

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: Сэм

Predicate java что это

Спасибо! А вот «в официальной документации Oracle» очень забавно, что отсортировано по имени. Уффф молодцы)))

Andrew Уровень 35
9 октября 2021

Зачем использовать Function valueConverter = x -> Integer.valueOf(x); если можно использовать public Integer valueConverter(String x)

Alexander Уровень 33
2 февраля 2021
Не благодарите ��

 //Test.java @FunctionalInterface interface Converter < Raccoon convert(Dog t); static boolean isNotNull(Dog t) < return t != null; >default void writeToConsole(Dog t) < System.out.println("Текущий объект - " + t.toString()); >boolean equals(Object obj); > class Dog < String name; int age; int weight; public Dog(final String name, final int age, final int weight) < this.name = name; this.age = age; this.weight = weight; >> class Raccoon < String name; int age; int weight; public Raccoon(final String name, final int age, final int weight) < this.name = name; this.age = age; this.weight = weight; >> class Test < public static void main(String[] args) < Dog dog = new Dog("Bobbie", 5, 3); Converter converter = (Dog x) ->new Raccoon(x.name, x.age, x.weight); Raccoon raccoon = converter.convert(dog); System.out.println("Raccoon has parameters: name - " + raccoon.name + ", age - " + raccoon.age + ", weight - " + raccoon.weight); > > 

LindX Уровень 12
18 декабря 2020
Интересно что за .

 Converter converter = x -> new Raccoon(x.name, x.age, x.weight); 
 Converter converter = x -> new Raccoon(x.name, x.age, x.weight); 

LindX Уровень 12
18 декабря 2020

 @FunctionalInterface public interface Converter < N convert(T t); static boolean isNotNull(T t)< return t != null; >> 

Я не очень понимаю почему не :

 @FunctionalInterface public interface Converter  < N convert(T t); static boolean isNotNull(T t) < return t != null; >> 

?? isNotNull статический же
LindX Уровень 12
18 декабря 2020
> Вернёмся же к классу `Comparator`. Может все же к интерфейсу?
LindX Уровень 12
18 декабря 2020

 @FunctionalInterface public interface Converter

и как это интересно должно работать?
Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *