我有一个清单
List<String[]> csvRows, String[] csvHeaderRow
我的目标是计算我将从这些行中写入的最终 CSV 文件的总大小。所以我应该添加所有逗号的总大小,
csvRows
,csvHeaderRow
。请注意,csvRows
中的许多列可能像 "Rick,,,,15,,4324,,,"
一样为空。 csvHeaderRow
将始终被完全填充。
我可以将这些全部写入
ByteArrayOutputStream
并计算字节数组的长度。但我想编写更高效、更简洁的代码。
最新代码版本:
public void long getNumOfFiles(List<String[]> csvRows, String[] csvHeaderRow){
long totalSize = csvRows.stream().mapToLong(i -> {
return Stream.of(i).mapToLong(str -> {
if (StringUtils.isNotEmpty(str)) {
return str.getBytes().length;
}
return 0L;
}).sum();
}).sum();
totalSize = totalSize + Stream.of(csvHeaderRow).mapToLong(str -> str.getBytes().length).sum();
totalSize = totalSize + csvHeaderRow.length * csvRows.size() + 1; -> number of commas
long numOfFiles = (totalSize / MAX_FILE_SIZE_BYTES) + 1;
return numOfFiles;
}
如何更有效地写这个?
我不确定你的算法是否正确,但以下是一个更简单的
Stream
解决方案,它返回等效的结果:
long totalSize = Stream.concat(Stream.<String[]>of(csvHeaderRow), csvRows.stream())
.mapToLong(row ->
Arrays.stream(row)
.mapToInt(s -> s == null ? 0 : s.getBytes().length)
.sum()
+ row.length - 1)
.sum();
totalSize += 1;
return totalSize / MAX_FILE_SIZE_BYTES + 1;
以下解决方案与您的不同,但我认为给出了实际正确的结果(尽管我不确定
MAX_FILE_SIZE_BYTES
除法是什么):
long totalSize = Stream.concat(Stream.<String[]>of(csvHeaderRow), csvRows.stream())
.mapToLong(row ->
// Number of characters per row, plus one for each comma
Arrays.stream(row)
.mapToInt(s -> s == null ? 0 : s.getBytes().length)
.sum()
+ row.length - 1)
.sum();
totalSize += csvRows.size() + 1; // Add number of newlines (including trailing one)
return totalSize / MAX_FILE_SIZE_BYTES + 1; // Whatever this is