Java 8 通过Java8StreamsAPI进行StringBuilder操作

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

我正在努力从StringBuilder中删除一些字符。这种方法效果很好。但是,我希望通过Java-8 streams API实现同样的功能。当前代码冗长。有没有办法通过Java 8 streams 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;
}
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
-首先读取所有数据,然后处理。相反,如果是
文件,则会同时处理和读取数据行。流管道读取并处理文件的最后一行后,将有一个删除了
^ ^
字符的文件行列表

你能简化你的问题吗?你的用例是什么?提供一些输入和期望的输出,以便我们可以帮助您。您能简化您的问题吗?你的用例是什么?给出一些输入和期望的输出,以便