openplanning

Hướng dẫn và ví dụ Java Supplier

Xem thêm các chuyên mục:

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

1- Supplier

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

2- Supplier Usage

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)

3- Supplier + Method reference

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

4- Supplier + Constructor reference

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

Xem thêm các chuyên mục: