Функциональный интерфейс принимает поток или опционально?

Я хочу создать @FunctionalInterface в Java, которая принимает оба Streamс или Optional Типы в качестве параметра. Я пытался сделать это, но так как у них нет общего интерфейса, кажется, что это невозможно. Я также попытался использовать общий класс-обертку, который вызывает @FunctionalInterface но так как мне нужны параметры типа во время выполнения, кажется, что это невозможно.

Минимальный пример:

@FunctionalInterface
public interface AcceptingInterface<S, T> {

    T accept(S s);

}

public class Test<S, T> {

    private final AcceptingInterface<S, T> funcInterface;

    private final Class<S> source;

    private final Class<T> target;

    public Test(AcceptingInterface<S, T> a, Class<S> s, Class<T> t) {
        this.funcInterface = a;
        this.source = s;
        this.target = t;
    }

    public T invoke(S s) {
        return s == null ? null : this.funcInterface.accept(s);
    }

    public Class<S> getSource() {
        return source;
    }

    public Class<T> getTarget() {
        return target;
    }
}

Возможно, мой подход неправильный... Я хотел бы получить обратную связь и / или решение этой проблемы.

1 ответ

Решение

Я предполагаю, что вы хотите обработать Optional как поток с 0-1 элементами, и в этом случае вы можете добавить метод по умолчанию, который переводит из Optional в Stream, таким образом:

@FunctionalInterface
public interface AcceptingInterface<V, T> {

    T accept(Stream<? extends V> s); 
    default T accept(Optional<? extends V> opt){
        return accept(opt.map(Stream::of).orElseGet(Stream::empty)); 
    }

}

Java 9 должна добавить Optional.stream() метод.

Другие вопросы по тегам