【问题标题】:Java 8 forEach not preserving orderJava 8 forEach 不保留顺序
【发布时间】: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);
}

电流输出: 它无序打印输出。

预期输出: 它应该按 LEG 编号的顺序打印行

【问题讨论】:

  • 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的实际类型,不是维护订单。

标签: lambda foreach java-8


【解决方案1】:

一个集合通常是无序的,尤其是最常用的 HashSet。 大多数 Lamba 操作可以按任何顺序执行,甚至可能并行执行。 然而,直接在列表上的 forEach 会按顺序执行。

【讨论】:

    【解决方案2】:

    您应该首先按legnumber 对实体进行排序 例如:

    Collections.sort(entities, (o1, o2) -> o1.getLegNumber().compareTo(o2.getLegNumber()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2014-01-21
      • 2014-12-01
      • 2015-04-30
      • 2018-02-16
      相关资源
      最近更新 更多