通用函数stream.map

时间:2018-03-07 22:37:59

标签: java function generics lambda java-stream

我目前有一个类测试,它将流转换为相同类型的流。

class Test {
    private Function<A1, A1> a1Transform;
    private Function<A2, A2> a2Transform;

    public <T extends A> Stream<T> transform(Stream<T> input) {
        return input
            .filter(o -> o instanceof A1)
            .map(A1.class::cast)
            .map(a1Transform);
    }
}

除非

,否则代码无法编译
  1. 我创建了返回类型Stream<? super T>
  2. 我添加.map(o -> (T) o)将其投回T.
  3. 任何一种解决方案都是好的。什么是解决这个问题的更好方法。

1 个答案:

答案 0 :(得分:1)

如果A1A2等具有共同的超类型A,那么您可以将方法更改为以下内容:

public Stream<A> transform(Stream<?> input) {
    return input.filter(o -> o instanceof A1)
                .map(o -> (A1) o)
                .map(a1Transform)
                .map(o -> (A) o);
}

方法无法返回,例如, Stream<A1> Stream<A2> Stream<A3>等。您可以做的最好的事情就像上面那样,您返回Stream<A>,或者您可以返回Stream<? extends A>

如果返回具有确切类型元素的流非常重要,那么您可以使用类似访问者模式的内容,并将访问者传递给方法,而不是直接返回流。

另一种可能的方法是让调用者将Class传递给方法:

public <T extends A> Stream<T> transform(Stream<?> input, Class<T> type) {
    return input...
                ...
                ...
                .map(type::cast);
}

但是,遇到这种问题通常表明你需要重新设计一些东西。通常,在面向对象的设计中,API外部的代码不应该关注具有特定类型的对象。