betacode

Руководство Java Supplier

  1. Supplier
  2. Supplier Usage
  3. Supplier + Method reference
  4. Supplier + Constructor reference

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
0

2. 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
Tom

4. 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: 8

Java Basic

Show More