JavaのStream API(IntStream)を触ってみた
調子に乗ってIntStreamも使ってみた。
UNIX/Linux系アプリにありがちな、実行時引数に「-」を使って色々なパラメータを渡すアレを受け取る処理を書いてみた。
例題として以下のパラメータを使用する。
- -c → 設定ファイルの指定
- -i → 入力ファイルの指定
- -o → 出力ファイルの指定
例えば以下のようにパラメータを指定する。
FooApplication -c configFile -i inputFile -o outputFile
当然、順番を変えて以下のように指定しても同じ意味となる。
FooApplication -i inputFile -c configFile -o outputFile
Javaの場合、mainメソッドの引数「String[] args」にそれぞれの値が配列に格納されて渡ってくるので、今回はそれをIntStreamを使って処理をする。
処理結果はMapに詰めて、キーにスイッチの値( -c など)を、バリューにそのスイッチの値 (configFile)を詰めることにする。
コードで書いた処理結果のイメージは以下の通り。
Map<String, String> map = new HashMap<>(); map.put("-c", "configFile"); map.put("-i", "inputFile"); map.put("-o", "outputFile");
Stream APIを使わなかった場合は以下の通り。(諸々のエラー処理は省略)
Map<String, String> map = new HashMap<>(); for (int i=0; i<args.length; i++) { if (args[i].startsWith("-")) { map.put(args[i], args[i+1]); } }
これがStream APIを使うと以下の通り。(諸々のエラー処理は省略)
Map<String, String> map = new HashMap<>(); IntStream.range(0, args.length) .filter(i -> args[i].startsWith("-")) .forEach(i -> map.put(args[i], args[i+1]));
・・・たぶん、IntStreamはこういう使い方をするためのものではないよね。
うん。知ってて使ってみた。