2016-07-01 3 views
0

Я хочу создать @FunctionalInterface в Java, который принимает в качестве параметра как Stream s, так и 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; 
    } 
} 

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

+0

Не знаете, что вы пытаетесь реализовать, но вам, похоже, придется использовать шаблон адаптера, чтобы эти два совместить с вашим функциональным интерфейсом. –

+0

@LyubomyrShaydariv Спасибо за вход, возможно, это путь, и я попробую. –

ответ

4

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

@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().

+0

Похоже на справедливый подход. Посмотрим, смогу ли я заставить это работать с описанным выше шаблоном адаптера. –

+0

@AlexvandenHoogen Ответ gustafc действительно _adapts_ необязательно для потока. Это то, о чем я говорил раньше: вы можете адаптировать как 'Stream', так и' Optional' к _common_ type, и этот ответ просто адаптирует _both_ 'Stream' и' Optional' к 'Stream'. Это прекрасный пример/ответ. –