2016-07-01 8 views
0

Ich möchte eine @FunctionalInterface in Java erstellen, die sowohl Stream s oder Optional Typen als Parameter akzeptiert. Ich habe versucht, dies zu tun, aber da sie keine gemeinsame Schnittstelle haben, scheint es unmöglich zu erreichen. Ich habe auch versucht, eine gemeinsame Wrapper-Klasse zu verwenden, die die @FunctionalInterface aufruft, aber da ich die Typparameter zur Laufzeit brauche, scheint es, dass dies nicht möglich ist.Funktionale Schnittstelle akzeptiert Stream oder optional?

Mindest Beispiel:

@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; 
    } 
} 

Vielleicht falsch mein Ansatz ist ... Ich würde gerne Feedback und/oder eine Lösung für dieses Problem zu erhalten.

+0

Nicht sicher, was Sie zu implementieren versuchen, aber Sie scheinen das Adaptermuster zu verwenden, um diese beiden an Ihrer funktionalen Schnittstelle auszurichten. –

+0

@LyubomyrShaydariv Danke für die Eingabe, vielleicht ist das der richtige Weg und ich werde es ausprobieren. –

Antwort

4

Ich gehe davon aus Sie einen Wunsch als einen Strom von 0-1 Elementen behandeln wollen, in dem Fall, dass Sie eine Standardmethode hinzufügen können, die aus Optional übersetzt zum Streamen, so:

@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 sollten eine Optional.stream() Methode hinzufügen.

+0

Scheint wie ein fairer Ansatz. Mal sehen, ob ich das mit dem oben vorgeschlagenen Adaptermuster zum Laufen bringen kann. –

+0

@AlexvandenHoogen gustafc die Antwort wirklich _adapts_ optional zu streamen. Das ist, worüber ich vorher gesprochen habe: Sie könnten sowohl 'Stream' als auch' Optional' an einen _common_ Typ anpassen und diese Antwort passt _both_ 'Stream' und' Optional' an 'Stream' an. Dies ist ein perfektes Beispiel/Antwort. –