我正在尝试设置@FuntionalInterface
以使用InputStream
s。
主要接口是:
界面StreamTransformer<T>
- 将InputStream
转换为其他内容。
接口IntermediateStreamTransform
- 将InputStream
转换为将在另一个转换器中使用的另一个InputStream
(已修改)。您可以链变压器来组成一个聚合变压器。
接口StreamTransformResult<T>
- 保存转换的结果。
@FunctionalInterface
public interface StreamTransformResult<T> {
T getResult() throws IOException;
}
@FunctionalInterface
public interface StreamTransformer<T> {
StreamTransformResult<T> transform( InputStream inputStream ) throws IOException;
}
@FunctionalInterface
public interface IntermediateStreamTransform {
InputStream intermediateTransform( InputStream inputStream ) throws IOException;
default IntermediateStreamTransform chain(IntermediateStreamTransform nextTransformer)
throws IOException {
Objects.requireNonNull(nextTransformer);
return new IntermediateStreamTransform() {
@Override
public InputStream intermediateTransform(InputStream is) throws IOException {
InputStream intermediateStream = this.intermediateTransform(is);
return nextTransformer.intermediateTransform(intermediateStream);
}
};
}
default <T> StreamTransformResult<T> finalize(InputStream is, StreamTransformer<T> streamTransformer)
throws IOException {
Objects.requireNonNull(streamTransformer);
return new StreamTransformResult<T>() {
@Override
public T getResult() {
InputStream intermediateStream = this.intermediateTransform(is); //is cannot be resolved
StreamTransformResult<T> streamTransformResult = streamTransformer.transform( intermediateStream );
return streamTransformResult.getResult();
}
};
}
}
我正在努力在界面default
中开发finalize
IntermediateStreamTransform
方法。
我找不到一种方法来调用非默认方法intermediateTransform(InputStream is)
并传递InputStream
。
该方法的算法是 - IntermediateStreamTransform.finalize(StreamTransformer<T> streamTransformer)
:
intermediateTransform(InputStream is)
:这将执行中间转换并返回中间InputStream
。transform(InputStream)
传递的参数方法StreamTransformed
:这将执行最终转换并返回StreamTransformResult
实例。StreamTransformResult
个实例。那么我该如何实现该方法?
GitHub repo is here。
答案 0 :(得分:3)
警告在您的匿名内部类IntermediateStreamTransform
和StreamTransformResult
中,this
将引用内部类而不是外部类,您应该在其前面添加&#34 ; IntermediateStreamTransform.
&#34;为了引用界面intermediateTransform
的方法IntermediateStreamTransform
而不是this.intermediateTransform(is)
,它应该是IntermediateStreamTransform.this.intermediateTransform(is)
。实际上,否则在IntermediateStreamTransform
类型的匿名内部类中,当调用StackOverFlowError
时,您将获得intermediateTransform
,因为它将无限期地调用自己。
另一种方法是简单地使用lambda表达式,因为它们是FuntionalInterface
接口,并且lambda表达式主体中的this
引用外部类,它可能不易出错且详细。< / p>
因此,您的default
方法的代码可以是:
default IntermediateStreamTransform chain(IntermediateStreamTransform nextTransformer)
throws IOException {
Objects.requireNonNull(nextTransformer);
return is -> {
InputStream intermediateStream = this.intermediateTransform(is);
return nextTransformer.intermediateTransform(intermediateStream);
};
}
default <T> StreamTransformResult<T> finalize(InputStream is,
StreamTransformer<T> streamTransformer) throws IOException {
Objects.requireNonNull(streamTransformer);
return () -> {
InputStream intermediateStream = this.intermediateTransform(is);
StreamTransformResult<T> streamTransformResult = streamTransformer.transform(
intermediateStream
);
return streamTransformResult.getResult();
};
}