【发布时间】:2018-03-07 22:37:59
【问题描述】:
我目前有一个将流转换为相同类型的流的类测试。
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);
}
}
代码不会编译,除非
- 我将返回类型设为
Stream<? super T>或 - 我添加一个
.map(o -> (T) o)将其转换回T。
这两种解决方案都有什么好处。解决这个问题的更好方法是什么。
【问题讨论】:
-
map(A1.class::cast)之后,流的实际类型是Stream<A1>。返回类型Stream<T>可能是错误的,但您需要告诉我们更多关于您尝试做什么的信息,然后我们才能告诉您对代码的正确更改是什么。 -
transform的主体似乎只适用于Stream<A1>,那么为什么不将其声明为Stream<A1> transform(Stream<A1> input)?filter-step 是必不可少的,还是要将Function<A, A>作为第二个参数传递给transform? -
A1 只是一个例子。我可以有一个
if循环来检查要应用哪个转换。 -
用例:我有一组关于实现接口的对象的转换。像 A1、A2、A3 都实现接口 A。现在根据流中对象的类型,我想应用适当的转换,然后返回结果流。 @Radiodef
-
输入应与输出流具有相同的类型。示例:输入 Stream
,我希望返回是 Stream 或 Input Stream ,我希望返回是 Stream 。因此,在上述问题中,输入将是 Stream 我将其转换为 A1,然后应用 a1Transform,然后再次将其转换为 A1
标签: java function generics lambda java-stream