Java 8 - Supplier 예제

By JS | Last updated: May 29, 2021

Supplier는 인자를 받지 않고 Type T 객체를 리턴하는 함수형 인터페이스입니다.

public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

Example 1 : Supplier

"HelloWorld"라는 문자열을 리턴하는 Supplier 예제입니다. Supplier로부터 객체를 리턴받을 때는 get()을 호출하면 됩니다.

import java.util.function.Supplier;

public class SupplierExample1 {

    public static void main(String[] args) {

        Supplier<String> supplier= ()-> "HelloWorld";

        String result = supplier.get();

        System.out.println(result);
    }
}

Output:

HelloWorld

Example 2 : Supplier

Item 클래스의 객체를 리턴받는 예제입니다. Supplier는 Generics로 구현되어 어떤 클래스의 객체도 리턴하도록 구현할 수 있습니다.

import java.util.function.Supplier;

public class SupplierExample2 {

    public static void main(String[] args) {

        Supplier<Item> supplier= ()-> new Item(10, "Hello");

        Item result = supplier.get();

        System.out.println(result.getId() + ", " + result.getValue());
    }
}
/* Item.java */

public class Item {
    private int id;
    private String value;
    public Item(int id, String value) {
        this.id = id;
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public String getValue() {
        return value;
    }
}

Output:

10, Hello

Example 3 : Supplier with method reference

Method reference 방식으로 Supplier를 정의하는 예제입니다. 인자를 받지 않고 String의 객체를 리턴하는 메소드 getHelloWorld()가 있습니다. SupplierExample3::getHelloWorld와 같은 형식으로 입력하면 Supplier<String> 객체가 입력됩니다.

import java.util.function.Supplier;

public class SupplierExample3 {

    public static void main(String[] args) {

        Supplier<String> supplier= SupplierExample3::getHelloWorld;

        String result = supplier.get();

        System.out.println(result);
    }

    public static String getHelloWorld() {
        return "Hello World";
    }
}

Output:

Hello World

Example 4 : Primitive Supplier

Primitive 타입에 대한 Supplier들입니다. Generics로 구현된 Supplier와 다르게, Primitive 타입 전용의 Supplier들이 제공됩니다.

import java.util.function.*;

public class SupplierExample4 {

    static String hello = "hello";

    public static void main(String[] args) {

        BooleanSupplier booleanSupplier = () -> hello.equals("world");
        IntSupplier intSupplier = () -> hello.length();
        LongSupplier longSupplier = () -> hello.length();
        DoubleSupplier doubleSupplier = () -> 12.34 - hello.length();

        System.out.println(booleanSupplier.getAsBoolean());
        System.out.println(intSupplier.getAsInt());
        System.out.println(longSupplier.getAsLong());
        System.out.println(doubleSupplier.getAsDouble());
    }
}

Output:

false
5
5
7.34

Example 5 : Supplier with Stream.generate()

Stream.generate()는 Supplier를 인자로 받아, 무한한 Stream을 생성합니다. 예제에서는 Random 숫자를 리턴하는 Supplier를 정의하였습니다. limit(5)는 Stream을 5개로 제한하는 코드이고, forEach(System.out::println)는 Loop를 돌면서 객체를 출력합니다.

import java.util.Random;
import java.util.function.*;
import java.util.stream.Stream;

public class SupplierExample5 {

    public static void main(String[] args) {

        Supplier<Integer> randomNumbersSupplier = () -> new Random().nextInt(100);

        Stream.generate(randomNumbersSupplier)
                .limit(5)
                .forEach(System.out::println);
    }
}

Output:

32
57
11
10
91

References

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha