読者です 読者をやめる 読者になる 読者になる

JavaのStream API(IntStream)を触ってみた

/IT系 /Java

調子に乗って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はこういう使い方をするためのものではないよね。
うん。知ってて使ってみた。