Руководство Java Supplier
1. Supplier
В Java 8, Supplier - это простой functional interface, который представляет собой оператор, предоставляющий значение для каждого вызова. Supplier имеет только один метод get() и не имеет метода по умолчанию.
Supplier
@FunctionalInterface
public interface Supplier<T> {
    T get();
}Существует несколько других подобных functional interface, которые предоставляют примитивные (primitive) значения:IntSupplier, DoubleSupplier, LongSupplier, BooleanSupplier:
IntSupplier int getAsInt();
DoubleSupplier double getAsDouble();
LongSupplier long getAsLong();
BooleanSupplier boolean getAsBoolean();- IntSupplier
 - DoubleSupplier
 - LongSupplier
 - BooleanSupplier
 
Например: Использование Supplier для возврата случайного числа для каждого вызова.
SupplierEx1.java
package org.o7planning.ex;
import java.util.function.Supplier;
public class SupplierEx1 {
    public static void main(String[] args) {
        
         Supplier<Double> random = () -> Math.random();
         
         System.out.println("Random value: " + random.get());
         System.out.println("Random value: " + random.get());
         System.out.println("Random value: " + random.get());
    }
}Output:
Random value: 0.5085772031422864
Random value: 0.666568263619468
Random value: 0.18177402871597048Например: Использование Supplier для возврата текущей даты:
SupplierEx2.java
package org.o7planning.ex;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.Supplier;
public class SupplierEx2 {
    private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public static void main(String[] args) {
        Supplier<LocalDateTime> s = () -> LocalDateTime.now();
        LocalDateTime time = s.get();
        System.out.println(time);
        Supplier<String> s1 = () -> dtf.format(LocalDateTime.now());
        String time2 = s1.get();
        System.out.println(time2);
    }
}Output:
2021-02-12T13:31:43.023203
2021-02-12 13:31:43Например: Использование Supplier в статическом методе Stream.generate для печати 5 случайных чисел:
// Method of java.util.stream.Stream class:
static <T> Stream<T> generate(Supplier<T> s)SupplierEx3.java
package org.o7planning.ex;
 
import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class SupplierEx3 {
 
    public static void main(String[] args) {
        // Returns a random integer in range [0,10)
        Supplier<Integer> randomNumbersSupp = () -> new Random().nextInt(10);
        
        Stream.generate(randomNumbersSupp)
                        .limit(5)
                        .forEach(System.out::println); // .forEach(Consumer)
    }
}Output:
5
5
0
2
02. Supplier Usage
Ниже приведен список методов в пакете java.util с использованием Supplier:
Modifier and Type  | Method and Description  | 
T  | Optional.orElseGet(Supplier<? extends T> other)  | 
<X extends Throwable>
 T  | Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)  | 
<X extends Throwable>
 long  | OptionalLong.orElseThrow(Supplier<X> exceptionSupplier)  | 
<X extends Throwable>
 double  | OptionalDouble.orElseThrow(Supplier<X> exceptionSupplier)  | 
<X extends Throwable>
 int  | OptionalInt.orElseThrow(Supplier<X> exceptionSupplier)  | 
static <T> T  | Objects.requireNonNull(T obj, Supplier<String> messageSupplier)  | 
3. Supplier + Method reference
Метод, который не принимает никаких параметров и возвращает значение, то его ссылка будет считаться Supplier.
SupplierEx4.java
package org.o7planning.ex;
import java.time.LocalDate;
import java.util.function.Supplier;
public class SupplierEx4 {
    public static void main(String[] args) {
        Supplier<Integer> s1 = MyUtils::getCurrentYear; // Method reference
        System.out.println(s1.get());
        
        Employee employee = new Employee("Tom");
        
        Supplier<String> s2 = employee::getName; // Method reference
        
        System.out.println(s2.get());
    }
    public static class MyUtils {
        public static int getCurrentYear() {
            return LocalDate.now().getYear();
        }
    }
    
    public static class Employee {
        private String name;
        
        public Employee(String name) {
            this.name = name;
        }
        
        public String getName() {
            return this.name;
        }
    }
}Output:
2021
Tom4. Supplier + Constructor reference
Конструктор создаст новый объект, если у него нет параметров, то его ссылка считается Supplier.
SupplierEx7.java
package org.o7planning.ex;
import java.util.Random;
import java.util.function.Supplier;
public class SupplierEx7 {
    public static void main(String[] args) {
        Supplier<Random> s = Random::new; // Constructor reference
        //
        int randomValue = s.get().nextInt(10);
        System.out.println("Random Value: " + randomValue);
    }
    
}Output:
Random Value: 8Java Basic
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
 - Программирование на Java для группы с помощью Eclipse и SVN
 - Руководство Java WeakReference
 - Руководство Java PhantomReference
 - Сжатие и декомпрессия в Java
 - Настройка Eclipse для использования JDK вместо JRE
 - Методы String.format() и printf() в Java
 - Синтаксис и новые функции в Java 8
 - Регулярные выражения Java
 - Руководство Java Multithreading Programming
 - Библиотеки Java JDBC Driver для различных типов баз данных
 - Руководство Java JDBC
 - Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
 - Руководство Java Stream
 - Руководство Java Functional Interface
 - Введение в Raspberry Pi
 - Руководство Java Predicate
 - Абстрактный класс и Interface в Java
 - Модификатор доступа (Access modifiers) в Java
 - Руководство Java Enum
 - Руководство Java Annotation
 - Сравнение и Сортировка в Java
 - Руководство Java String, StringBuffer и StringBuilder
 - Обработка исключений Java - Java Exception Handling
 - Руководство Java Generics
 - Манипулирование файлами и каталогами в Java
 - Руководство Java BiPredicate
 - Руководство Java Consumer
 - Руководство Java BiConsumer
 - Что мне нужно для начала работы с Java?
 - История Java и разница между Oracle JDK и OpenJDK
 - Установить Java в Windows
 - Установите Java в Ubuntu
 - Установите OpenJDK в Ubuntu
 - Установить Eclipse
 - Установите Eclipse в Ubuntu
 - Быстрое изучение Java для начинающих
 - История бит и байтов в информатике
 - Типы данных в java
 - Битовые операции
 - Команда if else в Java
 - команды switch в Java
 - Циклы в Java
 - Массивы (Array) в Java
 - JDK Javadoc в формате CHM
 - Наследование и полиморфизм в Java
 - Руководство Java Function
 - Руководство Java BiFunction
 - Пример Java encoding и decoding с использованием Apache Base64
 - Руководство Java Reflection
 - Java Удаленный вызов методов - Java RMI
 - Руководство Программирование Java Socket
 - Какую платформу я должен выбрать для разработки приложений Java Desktop?
 - Руководство Java Commons IO
 - Руководство Java Commons Email
 - Руководство Java Commons Logging
 - Понимание Java System.identityHashCode, Object.hashCode и Object.equals
 - Руководство Java SoftReference
 - Руководство Java Supplier
 - Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
 
                Show More
            
- Руководства Java Servlet/JSP
 - Руководства Java Collections Framework
 - Java API для HTML, XML
 - Руководства Java IO
 - Руководства Java Date Time
 - Руководства Spring Boot
 - Руководства Maven
 - Руководства Gradle
 - Руководства Java Web Services
 - Руководства Java SWT
 - Руководства JavaFX
 - Руководства Oracle Java ADF
 - Руководства Struts2 Framework
 - Руководства Spring Cloud