Java 8 通过Java8StreamsAPI进行StringBuilder操作
我正在努力从StringBuilder中删除一些字符。这种方法效果很好。但是,我希望通过Java-8 streams API实现同样的功能。当前代码冗长。有没有办法通过Java 8 streams API重构第二个方法removeCarryReturnsCharacters()Java 8 通过Java8StreamsAPI进行StringBuilder操作,java-8,java-stream,stringbuilder,Java 8,Java Stream,Stringbuilder,我正在努力从StringBuilder中删除一些字符。这种方法效果很好。但是,我希望通过Java-8 streams API实现同样的功能。当前代码冗长。有没有办法通过Java 8 streams API重构第二个方法removeCarryReturnsCharacters() private static StringBuilder readEntireFileUsingStream(Path filePath) throws IOException { StringBuilder
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;
}
private static StringBuilder ReadEntRefileusingStream(路径文件路径)引发IOException{
StringBuilder数据=新的StringBuilder(String.valueOf(Files.readAllLines(filePath,StandardCharsets.ISO_8859_1));
返回removeCarryReturnsCharacters(数据);
}
私有静态StringBuilder removeCarryReturnsCharacters(StringBuilder文件数据){
int-endIndex=1012;
字符串needToRemove=“”;
long-totDataChunkCount=fileData.length()/1014;
长delCounter=1;
试一试{
while(delCounter
由于缺少流API,当前代码不是冗长的,而是大量不必要的操作:
- 初始分配
需要删除=”代码>已过时
- 您正在维护两个冗余循环变量,
和delCounter
endIndex
- 您使用的是
循环,尽管您有一个带有初始语句、条件和增量操作的经典计数循环,但确切地说,while
循环是为for
- 对于绝对不会超过
值范围的值,您正在使用int
变量long
- 您有一个过时的
块,只需重新抛出捕获的异常try…catch
- 您不需要使用
移动
变量来保存一个对象以供一次使用;您可以简单地检查
,或者,我更愿意只检查两个字符,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;
}
私有静态StringBuilder removeCarryReturnsCharacters(StringBuilder文件数据){
对于(int-endIndex=1012;endIndex
我认为重写循环以使用流API不会带来任何额外的好处。由于缺少流API,当前代码并不冗长,而是大量不必要的操作:
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;
}
- 初始分配
需要删除=”代码>已过时
- 您正在维护两个冗余循环变量,
和delCounter
endIndex
- 您使用的是
循环,尽管您有一个带有初始语句、条件和增量操作的经典计数循环,但确切地说,while
循环是为for
- 对于绝对不会超过
值范围的值,您正在使用int
变量long
- 您有一个过时的
块,只需重新抛出捕获的异常try…catch
- 您不需要使用
移动
变量来保存一个对象以供一次使用;您可以简单地检查
,或者,我更愿意只检查两个字符,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;
}
私有静态StringBuilder removeCarryReturnsCharacters(StringBuilder文件数据){
对于(int-endIndex=1012;endIndex
我认为重写循环以使用流API不会带来任何额外的好处。看起来您正在尝试从原始文件的各个行中删除
^
。您可以仅使用File.lines
和Stream.map
来解决此问题:
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;
}
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());
但是,将所有行读入列表,但是
在流被消耗时缓慢填充
在这种情况下,如果我们使用一个大的
StringBuilder
-首先读取所有数据,然后处理。相反,如果是文件,则会同时处理和读取数据行。流管道读取并处理文件的最后一行后,将有一个删除了^ ^
字符的文件行列表 看起来您正试图从原始文件的各个行中删除^
。您可以仅使用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());
但是,将所有行读入列表,但是
在流被消耗时缓慢填充
在这种情况下,如果我们使用一个大的
StringBuilder
-首先读取所有数据,然后处理。相反,如果是文件,则会同时处理和读取数据行。流管道读取并处理文件的最后一行后,将有一个删除了^ ^
字符的文件行列表 你能简化你的问题吗?你的用例是什么?提供一些输入和期望的输出,以便我们可以帮助您。您能简化您的问题吗?你的用例是什么?给出一些输入和期望的输出,以便