2016-07-01 3 views
0

또는 Optional 유형을 매개 변수로 사용할 수있는 Java에서 @FunctionalInterface을 생성하려고합니다. 나는이 일을 시도했지만 공통 인터페이스를 공유하지 않기 때문에 성취하기가 불가능 해 보입니다. 또한 @FunctionalInterface을 호출하는 일반적인 래퍼 클래스를 사용해 보았습니다.하지만 런타임시 형식 매개 변수가 필요하기 때문에 불가능하다고 생각됩니다.Stream 또는 Optional을 수락하는 기능적 인터페이스?

최소 예 :

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

어쩌면 나의 접근 방식은 잘못된 것입니다 ... 나는 피드백 및/또는이 문제에 대한 해결책을받을 싶어요. 예상되는

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

} 

자바 9 :

+0

구현하고자하는 것이 확실하지 않지만 어댑터 패턴을 사용하여 기능적 인터페이스와 정렬되도록해야 할 것 같습니다. –

+0

@LyubomyrShaydariv 의견을 보내 주셔서 감사합니다. 어쩌면 그것이가는 길이며 시도해 보겠습니다. –

답변

4

나는 당신이 thusly 히 당신 스트리밍 옵션에서 번역하는 기본 방법을 추가 할 수있는 경우에 0-1 요소 스트림, 같은 옵션을 치료한다고 가정 Optional.stream() 메서드를 추가하십시오.

+0

공정한 접근 방식처럼 보입니다. 위의 제안 된 어댑터 패턴을 사용하여이 작업을 수행 할 수 있는지 봅시다. –

+0

@AlexvandenHoogen gustafc의 답변은 실제로 _adapts_ 선택 사항입니다. 이전에 얘기 한 내용입니다. _common_ 유형에'Stream'과'Optional'을 모두 적용 할 수 있습니다.이 대답은'Stream'에'Stream'과'Optional'을 단지 적용합니다. 이것은 완벽한 예/답입니다. –