实现功能接口以使用InputStreams

时间:2017-01-27 16:24:04

标签: java functional-programming java-8

情景

我正在尝试设置@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)

  1. 调用方法intermediateTransform(InputStream is):这将执行中间转换并返回中间InputStream
  2. 调用transform(InputStream)传递的参数方法StreamTransformed:这将执行最终转换并返回StreamTransformResult实例。
  3. 返回StreamTransformResult个实例。
  4. 那么我该如何实现该方法?

    GitHub repo is here

1 个答案:

答案 0 :(得分:3)

警告在您的匿名内部类IntermediateStreamTransformStreamTransformResult中,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();
    };
}