优化这段代码 private String buildOrderList() { List<DBOrder> orderList = null; StringBuilder builder = new StringBuilder(); int listSize; int offset = 0; int limit = 50; for (int i = 0; i < 4; i++) { do { if(isUpload){ orderList = ObjectBox.get().boxFor(orderClasses[i]).query() .build().find(offset, limit); }else { orderList = ObjectBox.get().boxFor(orderClasses[i]).query() .equal(statusProps[i], PosConstants.UPLOAD_NOT) .build().find(offset, limit); } listSize = orderList.size(); for (DBOrder order : orderList) { builder.append(buildOrderForCsv(order)); builder.append("\r\n"); } offset += listSize; } while (listSize >= 50); publishProgress(i * 25 + 25); if (isCancelled()) return null; } return builder.toString(); }
时间: 2023-12-10 20:37:51 浏览: 20
可以考虑以下几点优化:
1. 将查询和构建 CSV 字符串的逻辑分离。将查询结果集和构建 CSV 字符串分开,使得代码更加清晰,易于维护和扩展。
2. 使用 Java 8 的 Stream API 简化代码。Stream API 可以帮助我们更加简洁地处理集合中的元素。
3. 使用 try-with-resources 管理资源。在使用一些需要手动关闭的对象时,try-with-resources 可以帮助我们自动关闭资源,避免资源泄露。
4. 对于大数据量的查询,可以使用分页查询,减少一次查询返回的结果集大小。
综上所述,可以将代码优化为如下所示:
```
private String buildOrderList() {
StringBuilder builder = new StringBuilder();
int batchSize = 50;
for (int i = 0; i < 4; i++) {
long totalCount;
if (isUpload) {
totalCount = ObjectBox.get().boxFor(orderClasses[i]).count();
} else {
totalCount = ObjectBox.get().boxFor(orderClasses[i]).query()
.equal(statusProps[i], PosConstants.UPLOAD_NOT)
.build().count();
}
int totalPage = (int) Math.ceil(totalCount * 1.0 / batchSize);
for (int j = 0; j < totalPage; j++) {
int offset = j * batchSize;
List<DBOrder> orderList;
if (isUpload) {
orderList = ObjectBox.get().boxFor(orderClasses[i]).query()
.build().find(offset, batchSize);
} else {
orderList = ObjectBox.get().boxFor(orderClasses[i]).query()
.equal(statusProps[i], PosConstants.UPLOAD_NOT)
.build().find(offset, batchSize);
}
orderList.stream()
.map(this::buildOrderForCsv)
.forEach(csv -> {
builder.append(csv).append("\r\n");
});
if (isCancelled()) return null;
}
publishProgress(i * 25 + 25);
}
return builder.toString();
}
```
这里使用了 Java 8 的 Stream API,将查询结果集中每个 DBOrder 对象映射为一个字符串 csv,然后使用 forEach 将其添加到 StringBuilder 中。同时,使用 Math.ceil 函数计算总页数,使用 for 循环分页查询每一页的结果集。使用 try-with-resources 管理 ObjectBox 对象的生命周期。