大家好,使用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());
}
}
}
}
答案 0 :(得分:3)
Optional
不能代替条件逻辑。
Optional
,以便API具有一致的方式:声明方法返回的值可能存在或不存在,而不返回null。返回null
很容易受到异常的影响,并且没有简单的方法就可以知道是否期望null
,而无需阅读文档。 Optional
使合同明确。
因此,用Optional
替换条件逻辑可能是可能,但这不太可能使您的代码变得更好或更容易阅读。
下面是一个满足您好奇心的示例:
if (nonNull(printWriter)) {
printWriter.flush();
}
成为
Optional.ofNullable(printWriter).ifPresent(PrintWriter::flush);