import java.util.Optional;
import java.util.function.*;

public class OptionalUtils {
    
    // Safe value extraction
    public static <T> T getValue(Optional<T> optional, T defaultValue) {
        return optional.orElse(defaultValue);
    }
    
    // Safe value extraction with supplier
    public static <T> T getValue(Optional<T> optional, Supplier<T> supplier) {
        return optional.orElseGet(supplier);
    }
    
    // Throw exception if empty
    public static <T> T getValueOrThrow(Optional<T> optional, String message) {
        return optional.orElseThrow(() -> new IllegalArgumentException(message));
    }
    
    // Map operation
    public static <T, R> Optional<R> map(Optional<T> optional, Function<T, R> mapper) {
        return optional.map(mapper);
    }
    
    // Filter operation
    public static <T> Optional<T> filter(Optional<T> optional, Predicate<T> predicate) {
        return optional.filter(predicate);
    }
    
    // FlatMap operation
    public static <T, R> Optional<R> flatMap(Optional<T> optional, Function<T, Optional<R>> mapper) {
        return optional.flatMap(mapper);
    }
    
    // Conditional execution
    public static <T> void ifPresent(Optional<T> optional, Consumer<T> action) {
        optional.ifPresent(action);
    }
    
    // Conditional execution with else
    public static <T> void ifPresentOrElse(Optional<T> optional, Consumer<T> action, Runnable emptyAction) {
        optional.ifPresentOrElse(action, emptyAction);
    }
}