Руководство Java Supplier
View more Tutorials:
В 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();
- TODO Link!
- TODO Link!
- TODO Link!
- TODO Link!
Например: Использование 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
Ниже приведен список методов в пакете 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) |
Метод, который не принимает никаких параметров и возвращает значение, то его ссылка будет считаться 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
Конструктор создаст новый объект, если у него нет параметров, то его ссылка считается 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