Hướng dẫn và ví dụ Java Supplier
Xem thêm các chuyên mục:

Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.


Trong Java 8, Supplier là một functional interface đơn giản, nó đại diện cho một toán tử cung cấp một giá trị cho mỗi lần gọi. Supplier có duy nhất một phương thức get() và không có phương thức mặc định.
Supplier
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Có một vài functional interface tương tự khác cung cấp các giá trị nguyên thuỷ (primitive) là IntSupplier, DoubleSupplier, LongSupplier, BooleanSupplier:
IntSupplier int getAsInt();
DoubleSupplier double getAsDouble();
LongSupplier long getAsLong();
BooleanSupplier boolean getAsBoolean();
Ví dụ: Sử dụng Supplier để trả về một số ngẫu nhiên cho mỗi lần gọi.
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
Ví dụ: Sử dụng Supplier để trả về ngày tháng hiện tại:
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
Ví dụ: Sử dụng Supplier trong phương thức tĩnh Stream.generate để in ra 5 số ngẫu nhiên:
// 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
Dưới đây là danh sách các phương thức trong package java.util sử dụng 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) |
Một phương thức không tham số và trả về một giá trị thì tham chiếu của nó sẽ được coi là một 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
Một Constructor sẽ tạo ra một đối tượng mới, nếu nó không có tham số thì tham chiếu của nó được coi là một 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