前回までのあらすじ
ジャバ八村にやってきた俺たちは、Streamの使い方を会得することは出来たが、Streamを作る方法については、いまだ明かされない謎が残っていた…。
という訳で、Java8のStreamの勉強の総仕上げ。
Streamを使おうと思ったら、Streamインスタンスを生成する必要がある。
Streamクラスのof()やIntStreamのrange()等のStreamクラスに直接用意されているメソッドは探しやすいし、List等のコレクションからstream()でStreamを取得するのも分かり易いが、それ以外にもStreamを返すメソッドがある。
クラス名 | メソッド名 | 説明 |
---|---|---|
java.lang.CharSequence | chars | 文字(char)のStream |
codePoints | 文字(コードポイント)のStream | |
java.util.regex.Pattern | splitAsStream | パターンで分割した各文字列のStream |
java.io.BufferedReader | lines | 読み込んだ各行のStream |
java.nio.file.Files | lines | ファイルの各行のStream |
list | ディレクトリー直下の各パス(ファイルやディレクトリー)のStream | |
walk | サブディレクトリーまで含めた各パスのStream | |
find | 条件指定可能なFiles#walk() | |
java.util.jar.JarFile | stream | jarファイル内のエントリー(JarEntry)のStream |
java.util.zip.ZipFile | stream | zipファイル内のエントリー(ZipEntry)のStream |
CharSequence(StringやStringBuilder等)のchars()やcodePoints()は、文字列を「文字の並び」として扱うのに便利。
まぁ、IntStreamで扱わないといけないので複雑になってしまう部分はあるけど。
(Scalaの方がシンプルなので、初心者だったらむしろScalaの書き方の方が分かりやすそうだが^^;)
この辺り、将来的にIntStreamが拡張されてもう少し便利になるような予感がする。
(少なくとも、int用のCollectorを受け取るcollectメソッドは有ってもいいんじゃないか?)
BufferedReader#lines()も便利だが、ファイルから読み込む場合はFiles#lines()を使うことの方が多そう。
ディレクトリー配下のファイル(やディレクトリー)のパス一覧を取得するFiles#list()やwalk()もnewDirectoryStream()やwalkFileTree()に比べたらずっとシンプル。
(Files#newDirectoryStream()はDirectoryStreamという(Listのような)オブジェクトを返すのだが、Java8のStreamが先に導入されていたら、きっとDirectoryStreamは作られなかっただろうと思う^^;)
Java8のStream関連で調べたかったことは、ひとまずこれで完了かな。
※コメント投稿者のブログIDはブログ作成者のみに通知されます