gpt4 book ai didi

java - 实现功能接口(interface)以使用 InputStreams

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:12 25 4
gpt4 key购买 nike

场景

我正在尝试开发一个 @FuntionalInterfaceInputStream一起工作

主要接口(interface)是:

  • 接口(interface) StreamTransformer<T> - 改造 InputStream变成别的东西。

  • 接口(interface) IntermediateStreamTransform - 改造 InputStream到另一个InputStream (修改)将在另一个变压器中消耗。您可以链接转换器以组成聚合转换器。

  • 接口(interface) 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接口(interface)中的方法 IntermediateStreamTransform .

我找不到调用非默认方法的方法 intermediateTransform(InputStream is)并通过 InputStream .

该方法的算法是 - 在 IntermediateStreamTransform.finalize(StreamTransformer<T> streamTransformer) 上:

  1. 调用方法intermediateTransform(InputStream is) :这将执行中间转换并返回中间值 InputStream .
  2. 调用方法transform(InputStream)StreamTransformed 上作为参数传递:这将执行最终转换并返回 StreamTransformResult实例。
  3. 返回StreamTransformResult实例。

那么我该如何实现这个方法呢?

GitHub repo is here .

最佳答案

IntermediateStreamTransformStreamTransformResult 类型的匿名内部类中警告,this 将引用内部类而不是外部类,你应该在它前面加上“IntermediateStreamTransform.”,以便引用 IntermediateStreamTransform 接口(interface)的方法 intermediateTransform 所以而不是 this .intermediateTransform(is) 应该是IntermediateStreamTransform.this.intermediateTransform(is)。事实上,否则在您的 IntermediateStreamTransform 类型的匿名内部类中,您将在调用 intermediateTransform 时收到 StackOverFlowError,因为它将无限期地调用自己。

另一种方法可能是简单地使用 lambda 表达式,因为它们是 FunctionalInterface 接口(interface),而 lambda 表达式主体中的 this 指的是外部类,它可能更少容易出错且冗长。

所以您的默认方法的代码可以是:

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

关于java - 实现功能接口(interface)以使用 InputStreams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41898519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com