Попытка минимизировать дублирующийся код в цикле - PullRequest
0 голосов
/ 26 ноября 2018

Я конвертирую свой цикл java for, который я написал, в поток java. Цикл for содержит дублирующийся код, который, я думаю, можно исправить потоком. Это то, что я делал, в моем старом цикле.

    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
        for (Path entry : stream) {
            String fileName = entry.getFileName().toString();
            if (Files.isDirectory(entry)) {
                grepFilesAndFolders(entry);
            } else if (shouldChange(entry)) {
                //Doing all the foreach work here
            }
        }
    }
}

и это то, что у меня сейчас есть в моем потоке

    Files.walk(path)
            .filter(this::shouldChange)
            .forEach(p -> {
                try {
                    String fileName = p.getFileName().toString();
                    Charset charset = StandardCharsets.UTF_8;
                    String content = new String(Files.readAllBytes(p), charset);
                    boolean contentChanged = false;
                    int count = countMatches(content, getName(oldName, '1'));
                    if (count > 0) {
                        content = replaceName(count,
                                getName(oldName, '1'),
                                fileName,
                                getName(newName, '1'),
                                content);
                        contentChanged = true;
                    }
                    count = countMatches(content, getName(oldName, '2'));
                    if (count > 0) {
                        content = replaceName(count,
                                getName(oldName, '2'),
                                fileName,
                                getName(newName, '2'), content);
                        contentChanged = true;
                    }
                    if (contentChanged) {
                        Files.write(p, content.getBytes(charset));
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

Я пытаюсь избавиться от дубликата кода, который выглядит следующим образом.

                    int count = countMatches(content, getName(oldName, '1'));
                    if (count > 0) {
                        content = replaceName(count,
                                getName(oldName, '1'),
                                fileName,
                                getName(newName, '1'),
                                content);
                        contentChanged = true;
                    }
                    count = countMatches(content, getName(oldName, '2'));
                    if (count > 0) {
                        content = replaceName(count,
                                getName(oldName, '2'),
                                fileName,
                                getName(newName, '2'), content);
                        contentChanged = true;
                    }
                    if (contentChanged) {
                        Files.write(p, content.getBytes(charset));
                    }

Я могу предположить, что я могу сделать замену в новом методе, а затем map в поток, но таким образом я не могу трактовать переменную contentChanged.Но я не знаю, как это сделать. Пока у меня есть только поток и фильтр.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018
private String replaceName(String content, String fileName, char ch) {
    if (countMatches(content, getName(oldName, ch)) > 0)
        content = replaceName(count, getName(oldName, ch), fileName, getName(newName, ch), content);

    return content;
}

Files.walk(path)
     .filter(this::shouldChange)
     .forEach(p -> {
         try {
             String fileName = p.getFileName().toString();
             final String content = new String(Files.readAllBytes(p), StandardCharsets.UTF_8);
             String changedContent = replaceName(content, fileName, '1');
             changedContent = replaceName(content, fileName, '2');

             if (!content.equals(changedContent))
                 Files.write(p, content.getBytes(StandardCharsets.UTF_8));
         } catch(IOException e) {
             e.printStackTrace();
         }
     });
}
0 голосов
/ 26 ноября 2018
for (char i = '1'; i < '3'; ++i) {
    int count = countMatches(content, getName(oldName, i));
    if (count > 0) {
        content = replaceName(count,
                getName(oldName, i),
                fileName,
                getName(newName, i),
                content);
        contentChanged = true;
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...