【发布时间】:2019-03-26 08:27:44
【问题描述】:
我遇到了一个问题,即 Java 8 for-each 循环在打印数据时没有保留顺序。 基本上,我正在打印一个集合列表。列表的顺序未按顺序打印。
请建议我是否可以在不将其更改为基本 for-each 循环的情况下订购输出。
代码示例:
AtomicInteger row = new AtomicInteger(1);
//entities is a List
entities.forEach(entity -> {
if (Optional.ofNullable(entity.getSet()).isPresent()) {
entity.getSet().forEach(obj -> {
try {
int column = 0;
addData(sheet, column++, row, nullToBlankString(entity.getName()));
addData(sheet, column++, row, convertLongToString(obj.getLegNumber()));
addData(sheet, column++, row, nullToBlankString(obj.getType()));
} catch (WriteException e) {
logger.error("Exception" + e.getCause().getMessage());
}
row.getAndIncrement();
});
}
});
private void addData(WritableSheet sheet, int column, AtomicInteger row, String s)
throws RowsExceededException, WriteException {
Label label;
label = new Label(column, row.get(), s, times);
sheet.addCell(label);
}
【问题讨论】:
-
entities是列表还是集合? -
这是一个很好的例子,说明当不惜一切代价尝试使用“Java 8 特性”时,代码会变得多么糟糕,却没有真正理解他们的意图。就像写
Optional.ofNullable(entity.getList()).isPresent()而不是entity.getList() != null或与AtomicInteger混在一起,普通循环可以顺利运行。至少,写nullToBlankString(null)而不是""是一致的。但无论如何——你为什么要检查entity.getList()的存在却遍历entity.getSet()? -
创建一个简化的示例很好,我们甚至很感激,只要您自己尝试该示例,以验证它仍然能够重现问题。将示例代码从您的 IDE 复制到浏览器应该不会引入拼写错误。
-
您能否提供证据证明编号为 1、2、3、4、5 的单元格实际上代表行号,并且 sheet.addCell 方法始终将单元格定位在其行所代表的行中.get() 构造函数参数?或者,您是否可以只使用 System.out.println 来说服自己 forEach 调用确实按顺序迭代,并且乱序问题是由于单元格的定位方式造成的?
-
别人说的,
entity.getSet()返回的方法是根据Set的实际类型,不是维护订单。