반응형
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 이 가능한 구조입니다만, 함수형 표현식에 관심사가 있다고 보면 좋을 거 같습니다.
언어 자체가 좀 더 자유로운 표현식을 사용할 수 있길 바랍니다.
반응형