Я написал этот метод:
public static void main(String... args) {
try (var linesStream = Files.lines(Paths.get("C:\\Users\\paul\\Desktop\\java.txt"))) {
Stream<String> words = linesStream.
flatMap(line -> Arrays.stream(line.split(" ")))
.distinct();
System.out.println("There are " + words.count() + " distinct words in this file, here they are:");
words.forEach(System.out::println);
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
Проблемы, с которыми я здесь сталкиваюсь, состоят в том, что я оперирую словами Stream<String>
дважды.Чтобы сделать это, вам нужно явно перестроить этот поток или есть какой-то магический метод сброса, который я мог бы использовать?
Кроме того, чтобы снова перестроить поток слов, я должен перестроить linesStream
и обернуть это в другой блок try / catch здесь ... Очень многословно.Какой способ облегчить написание таких вещей?
Наверное, я мог бы сделать:
static Stream<String> getStreamFromFile() throws IOException {
return Files.lines(Paths.get("C:\\Users\\paul\\Desktop\\java.txt"));
}
static Stream<String> getDistinctWords(Stream<String> lines) {
return lines
.flatMap(line -> Arrays.stream(line.split(" ")))
.distinct();
}
public static void main(String... args) {
Stream<String> lines1 = null;
Stream<String> lines2 = null;
try {
lines1 = getStreamFromFile();
lines2 = getStreamFromFile();
Stream<String> distinctWords1 = getDistinctWords(lines1);
Stream<String> distinctWords2 = getDistinctWords(lines2);
System.out.println("There are " + distinctWords1.count() + " distinct words in this file, here they are:");
distinctWords2.forEach(System.out::println);
} catch (IOException e) {
System.err.println(e.getMessage());
} finally {
lines1.close();
lines2.close();
}
}
, но это все, что у меня осталось?