Java - Supplier 예제

Java 8에서 도입된 Supplier의 사용 방법 및 예제를 소개합니다.

1. Supplier

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

public interface Supplier<T> {

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

2. Supplier 사용 방법

아래 예제는 "HelloWorld"라는 문자열을 리턴하는 Supplier 구현하여 사용하는 예제입니다.

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

3. Custom 클래스와 함께 사용하는 Supplier 예제

Item이라는 커스텀 클래스를 정의하였고, Supplier에서 이 클래스의 객체를 리턴하는 예제입니다.

Supplier 클래스는 Generics로 구현되어 어떤 클래스의 객체도 리턴할 수 있습니다.

import java.util.function.Supplier;

public class Example {

    public static void main(String[] args) {

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

        Item result = supplier.get();

        System.out.println(result.getId() + ", " + result.getValue());
    }

    public static 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

4. 메소드 레퍼런스와 함께 사용하는 Supplier 예제

Method reference를 사용하여 Supplier를 구현할 수 있습니다.

아래 예제에서 인자를 받지 않고 String의 객체를 리턴하는 메소드 getHelloWorld()를 정의하였습니다. 이 메소드를 메소드 레퍼런스로 표현하면 SupplierExample3::getHelloWorld가 됩니다. 이 표현을 다시 람다식으로 표현해보면 () -> getHelloWorld()가 됩니다.

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

5. Primitive 타입에 대한 Supplier

자바는 기본적으로 Primitive 타입에 대한 Supplier 클래스를 제공합니다.

  • BooleanSupplier
  • IntSupplier
  • LongSupplier
  • DoubleSupplier

다음과 같이 사용할 수 있습니다. get() 대신에 getAsInt()같은 함수를 사용하네요.

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

6. Stream.generate()에서 Supplier 사용

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
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha