Java 通用函数stream.map

Java 通用函数stream.map,java,function,generics,lambda,java-stream,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

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

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);
    }
}
类测试{
私人职能转变;
私人职能转变;
公共流转换(流输入){
返回输入
.过滤器(A1的o->o实例)
.map(A1.class::cast)
.map(a1Transform);
}
}
除非


  • 我将返回类型设置为
    流如果
    A1
    A2
    等具有公共超类型
    a
    ,则可以将该方法更改为以下内容:

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

    然而,遇到这种问题通常表明您需要重新设计某些东西。一般来说,在面向对象的设计中,API外部的代码不应该涉及特定类型的对象。

    映射(A1.class::cast)
    之后,流的实际类型是
    。返回类型
    Stream
    可能是错误的,但在我们告诉您对代码的正确更改之前,您需要告诉我们更多关于您正在尝试执行的操作。
    transform
    的主体似乎仅适用于
    Stream
    ,因此为什么不将其声明为
    Stream transform(Stream input)
    过滤器
    -步骤是必不可少的,还是希望将
    函数
    作为第二个参数传递给
    转换
    ?A1只是一个示例。我可以有一个
    if
    循环来检查应用哪个转换。用例:我有一个实现接口的对象上的转换集合。像A1、A2、A3一样,所有实现接口都是A。现在,根据流中对象的类型,我希望应用适当的转换,然后返回结果流@RADIODEF输入应具有与输出流相同的类型。示例:输入流,我希望返回为流或输入流,我希望返回为流。因此,在上面的问题中,输入将是流,我将其转换为A1,然后应用a1Transform,然后再次将其转换为A1
    public <T extends A> Stream<T> transform(Stream<?> input, Class<T> type) {
        return input...
                    ...
                    ...
                    .map(type::cast);
    }