我正在努力从StringBuilder中删除一些字符。这种方法效果很好。但是,我想通过Java-8StreamsAPI实现同样的目标。当前代码是冗长的。有没有办法通过Java8StreamsAPI重构第二个方法removeCarryReturnsCharacters()?
private static StringBuilder readEntireFileUsingStream(Path filePath) throws IOException {
StringBuilder data = new StringBuilder(String.valueOf(Files.readAllLines(filePath, StandardCharsets.ISO_8859_1)));
return removeCarryReturnsCharacters(data);
}
private static StringBuilder removeCarryReturnsCharacters(StringBuilder fileData){
int endIndex = 1012;
String needToRemove = "";
long totDataChunkCount = fileData.length()/1014;
long delCounter = 1;
try{
while (delCounter < totDataChunkCount) {
needToRemove = fileData.substring(endIndex, endIndex + 2);
if (needToRemove.equals("^^")) {
fileData.delete(endIndex, endIndex + 2);
}
endIndex += 1012;
delCounter++;
}
}catch(StringIndexOutOfBoundsException exp){
throw exp;
}
return fileData;
}发布于 2018-05-08 07:49:44
由于缺乏Stream,当前的代码并不冗长,而是大量不必要的操作:
needToRemove = "";已过时delCounter和endIndex。while循环,尽管您有一个具有初始语句、条件和增量操作的经典计数循环,确切地说,for循环是为long变量来表示绝对不会超过int值范围的值try … catch块,只需重新抛出捕获的异常。needToRemove变量来保存对象;您可以简单地检查if(fileData.substring(endIndex, endIndex + 2).equals("^^")),或者像我希望的那样只检查两个字符,
if(fileData.charAt(endIndex)=='^' && fileData.charAt(endIndex+1)=='^')解决所有这些问题将使方法变为
private static StringBuilder removeCarryReturnsCharacters(StringBuilder fileData) {
for(int endIndex = 1012; endIndex < fileData.length(); endIndex += 1012)
if(fileData.charAt(endIndex) == '^' && fileData.charAt(endIndex+1) == '^')
fileData.delete(endIndex, endIndex + 2);
return fileData;
}我不认为重写循环以使用Stream会带来任何额外的好处。
发布于 2018-05-08 08:06:37
private static StringBuilder removeCarryReturnsCharacters(StringBuilder fileData) {
Stream.iterate(1012, i -> i + 1012)
.limit(fileData.length() / 1014)
.sorted(Collections.reverseOrder())
.forEach(e -> {
if (fileData.substring(e, e + 2).equals("^^")) {
fileData.delete(e, e + 2);
}
});
return fileData;
}发布于 2018-05-08 13:28:47
看起来,您正在尝试从原始文件的各个行中删除^^。您可能只使用File.lines和Stream.map来解决这个问题。
List<String> lines = Files.lines(filePath, StandardCharsets.ISO_8859_1)
.map(line -> {
if (line.charAt(endIndex) == '^' && line.charAt(endIndex + 1) == '^') {
return new StringBuilder(line).delete(endIndex, endIndex + 2).toString();
} else {
return line;
}
})
.collect(Collectors.toList());我想这可能会比
new StringBuilder(String.valueOf(Files.readAllLines(...)))然而,readAllLines将所有行读入一个列表,但是线条在消耗流时懒洋洋地填充。
在这种情况下,如果我们使用一个大的StringBuilder -所有数据是读取第一和处理后。相反,在File.lines数据被处理并在同时读取的情况下,。在流管道读取和处理文件的最后一行之后,将有一个删除^^字符的文件行列表。
https://stackoverflow.com/questions/50227172
复制相似问题