package answers.section4;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class S405StreamInsteadOfFor {
public S405StreamInsteadOfFor() {
fileRead("src/questions/section4/S405StreamInsteadOfFor.java");
fileReadAnswer1("src/questions/section4/S405StreamInsteadOfFor.java");
fileReadAnswer2("src/questions/section4/S405StreamInsteadOfFor.java");
fileReadAnswer3("src/questions/section4/S405StreamInsteadOfFor.java");
}
private void fileRead(String filename) {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
int wordCount = 0;
for (;;) {
String line = reader.readLine();
if (line == null) {
break;
}
String[] words = line.split("[\\.,\\?; ]");
wordCount += words.length;
}
System.out.println(wordCount);
} catch (IOException ex) {
// 例外処理
}
}
private int wordCount = 0;
private void fileReadAnswer1(String filename) {
// Files.lines メソッドを使用して、ストリームを生成し
// forEach メソッドで単語数を数える
// しかし、wordCount 変数をフィールドとして宣言しなくてはいけないので、お勧めしない
Path path = Paths.get(filename);
try (Stream<String> stream = Files.lines(path)) {
stream.forEach(line -> {
String[] words = line.split("[\\.,\\?; ]");
wordCount += words.length;
});
System.out.println(wordCount);
} catch (IOException ex) {
// 例外処理
}
}
private void fileReadAnswer2(String filename) {
Path path = Paths.get(filename);
try (Stream<String> stream = Files.lines(path)) {
// S404StreamInsteadOfFor と同様に flatMap で単語を切り出し、
// count メソッドで単語数を数える
// count メソッドの返り値が long 型であることに注意
long wordCount = stream.flatMap(line -> Stream.of(line.split("[\\.,\\?; ]")))
.count();
System.out.println(wordCount);
} catch (IOException ex) {
// 例外処理
}
}
private void fileReadAnswer3(String filename) {
Path path = Paths.get(filename);
try (Stream<String> stream = Files.lines(path)) {
// collector メソッドと Collectors.counting メソッドで単語数を数える
// これも返り値が long 型であることに注意
long wordCount = stream.flatMap(line -> Stream.of(line.split("[\\.,\\?; ]")))
.collect(Collectors.counting());
System.out.println(wordCount);
} catch (IOException ex) {
// 例外処理
}
}
public static void main(String[] args) {
new S405StreamInsteadOfFor();
}
}