Я работаю с некоторыми файлами Apache POI, он работает, и я делаю некоторый рефакторинг по этому вопросу, но я сталкиваюсь с сомнением с этим кодом:
for (XWPFTable tbl : doc.getTables()) {
for (XWPFTableRow row : tbl.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph paragraph : cell.getParagraphs()) {
for (XWPFRun xwpfRun : paragraph.getRuns()) {
String text = xwpfRun.getText(0);
if (text != null && text.contains(key)) {
text = text.replace(key, replaces.get(key) == null ? "" : replaces.get(key));
xwpfRun.setText(text, 0);
}
}
}
}
}
}
Когда я пытаюсь заменить это лямбда-кодом, код выглядит так:
List<XWPFRun> collect = doc.getTables().stream().flatMap(xwpfTable -> xwpfTable.getRows().stream()
.flatMap(xwpfTableRow -> xwpfTableRow.getTableCells().stream().
flatMap(xwpfTableCell -> xwpfTableCell.getParagraphs().stream()
.flatMap(xwpfParagraph -> xwpfParagraph.getRuns().stream().filter(Objects::nonNull)))))
.collect(Collectors.toList());
И для меня этот код действительно сложен, так как он не возвращает ничего, что мне нужно разделить по одному для каждого:
for (XWPFRun xwpfRun : paragraph.getRuns()) {
String text = xwpfRun.getText(0);
if (text != null && text.contains(key)) {
text = text.replace(key, replaces.get(key) == null ? "" : replaces.get(key));
xwpfRun.setText(text, 0);
}
}
Я почти уверен, что есть лучший и более чистый способ сделать это, но я не мог понять это, у вас есть какие-нибудь идеи?