본문 바로가기

IT

Java Functional class

반응형
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

public class Functional<T> {

    private final T value;

    public Functional(T value) {
        this.value = value;
    }

    public static <T> Functional<T> of(T value) {
        return new Functional<>(
            Objects.requireNonNull(value)
        );
    }

    public static <T> Functional<T> of(Supplier<T> supplier) {
        Objects.requireNonNull(supplier);
        T result = Objects.requireNonNull(supplier.get());
        return new Functional<>(result);
    }

    public <R> Functional<R> map(Function<T, R> mapper) {
        Objects.requireNonNull(mapper);
        R result = mapper.apply(value);
        return Functional.of(result);
    }

    public Functional<T> apply(Consumer<T> consumer) {
        Objects.requireNonNull(consumer);
        consumer.accept(value);
        return this;
    }

    public T get() {
        return Objects.requireNonNull(value);
    }

    public T getOrElse(T other) {
        return value != null ? value : other;
    }

    public T getOrElseGet(Supplier<T> supplier) {
        return value != null ? value : supplier.get();
    }

    public <X extends Throwable> T getOrThrowIfNull(
        Supplier<X> exceptionSupplier
    ) throws X {
        if (value == null) {
            throw exceptionSupplier.get();
        }
        return value;
    }

    public <X extends Throwable> Functional<T> throwIfNull(
        Supplier<X> exceptionSupplier
    ) throws X {
        return Functional.of(
            getOrThrowIfNull(exceptionSupplier)
        );
    }
}

 

Kotlin 에 비할바는 아니지만, 간단히라도 함수식으로 표현식을 전환하기 위해서 만들어본 유틸리티 클래스입니다.

 

Optional 과 많이 닮았지만, Optional 은 값의 null 여부에 관심사가 있다고 보고, Functional 은 map method 로 인해서 null 이 가능한 구조입니다만, 함수형 표현식에 관심사가 있다고 보면 좋을 거 같습니다.

 

언어 자체가 좀 더 자유로운 표현식을 사용할 수 있길 바랍니다.

반응형