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