通过Java 8 Streams API进行StringBuilder操作

mal*_*are 1 stringbuilder java-8 java-stream

我正在努力从StringBuilder中删除一些字符.该方法工作正常.但是,我希望通过Java-8流API实现相同的功能.目前的代码很冗长.有没有办法通过Java 8流API重构第二个方法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;
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 7

由于缺少Stream API,当前代码并不详细,但是大量不必要的操作:

  • 初始分配needToRemove = "";已过时
  • 你正在维护两个冗余循环变量,delCounterendIndex
  • 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;
}
Run Code Online (Sandbox Code Playgroud)

我不认为重写循环以使用Stream API会有任何额外的好处.