重构此方法,将其认知复杂度从16降低到允许的15.如何重构并降低复杂性



如何降低下面这段代码的复杂性?我在SonarQube中得到这个错误:

High:重构此方法,将其认知复杂度从16降低到允许的15个

private void changeFontColorInMinusValue(final AssetContent content) throws IOException {
if (!Objects.isNull(content)){
try (final FileInputStream inputStream = new FileInputStream(content.getTemporaryFile());
final XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream()) {
final CellStyle style = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
style.setFont(font);
for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); ++sheetIndex) {
final XSSFSheet sheetAt = workbook.getSheetAt(sheetIndex);
for (Row row : sheetAt) {
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if(cell.getCellType() == NUMERIC && cell.getNumericCellValue() < 0){
cell.setCellStyle(style);
}
}
}
}
workbook.write(byteStream);
content.setTemporaryFile(AssetContentUtils.createAssetContentTempFile(new ByteArrayInputStream(byteStream.toByteArray())));
content.setContentLength(byteStream.size());
}
}
}

方法应该有更好的名字,但这应该有助于重构。

private void changeFontColorInMinusValue(final AssetContent content) throws IOException {
if (Objects.isNull(content)) return;
try (final FileInputStream inputStream = new FileInputStream(content.getTemporaryFile());
final XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream()) {
final CellStyle style = getCellStyle(workbook);
for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); ++sheetIndex) {
cellLoop(style, workbook.getSheetAt(sheetIndex));
}
workbook.write(byteStream);
content.setTemporaryFile(AssetContentUtils.createAssetContentTempFile(new ByteArrayInputStream(byteStream.toByteArray())));
content.setContentLength(byteStream.size());
}
}
private CellStyle getCellStyle(XSSFWorkbook workbook) {
final CellStyle style = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
style.setFont(font);
return style;
}
private void cellLoop(CellStyle style, XSSFSheet sheetAt) {
for (Row row : sheetAt) {
setCellStyle(style, row.cellIterator());
}
}
private void setCellStyle(CellStyle style, Iterator<Cell> cellIterator) {
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if (cell.getCellType() == NUMERIC && cell.getNumericCellValue() < 0) cell.setCellStyle(style);
}
}