如何在GZIPWrapper中用Optional.orElse替换?

时间:2018-10-30 10:18:54

标签: java servlets

大家好,使用gzip的人都遇到了一个问题。我有一个GzipWrapper,还有很多(如果有的话),是否可以使用Optional.orElse做类似的事情?通过简单的可选示例,我对其进行了整理,但是我不太了解如何在包装器中执行此操作。其中一种方法的示例就足够了)在此先感谢)

MyWrapper:

public class GZIPFilterResponseWrapper extends HttpServletResponseWrapper implements Closeable {

    private PrintWriter printWriter;
    private GZIPFilterResponseStream gzipStream;
    private ServletOutputStream outputStream;

    public GZIPFilterResponseWrapper(HttpServletResponse response) throws IOException {
        super(response);
        response.addHeader(CONTENT_ENCODING, GZIP);
        gzipStream = new GZIPFilterResponseStream(response.getOutputStream());
    }

    @Override
    public void flushBuffer() throws IOException {
        if (nonNull(printWriter)) {
            printWriter.flush();
        }
        if (nonNull(outputStream)) {
            outputStream.flush();
        }
        super.flushBuffer();
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        if (nonNull(printWriter)) {
            throw new IllegalStateException(GZIP_CANNOT_WRITE);
        }
        if (isNull(outputStream)) {
            outputStream = gzipStream;
        }
        return outputStream;
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        if (nonNull(outputStream)) {
            throw new IllegalStateException(GZIP_WRITER_ALREADY_HAS_CALLING);
        }
        if (isNull(printWriter)) {
            printWriter = new PrintWriter(new OutputStreamWriter(gzipStream, getResponse().getCharacterEncoding()));
        }
        return printWriter;
    }

    @Override
    public void close() throws IOException {
        if (nonNull(printWriter)) {
            printWriter.close();
        }
        if (nonNull(outputStream)) {
            try {
                outputStream.close();
            } catch (IOException e) {
                throw new IOException(e.getMessage());
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

Optional不能代替条件逻辑。

添加了

Optional,以便API具有一致的方式:声明方法返回的值可能存在或不存在,而不返回null。返回null很容易受到异常的影响,并且没有简单的方法就可以知道是否期望null,而无需阅读文档。 Optional使合同明确。

因此,用Optional替换条件逻辑可能是可能,但这不太可能使您的代码变得更好或更容易阅读。


下面是一个满足您好奇心的示例:

if (nonNull(printWriter)) {
    printWriter.flush();
}

成为

Optional.ofNullable(printWriter).ifPresent(PrintWriter::flush);