Functions#compose() を使って Function を合成するサンプル(Java8 との比較付き)

公開日: : Java ,

Java8 と GoogleGuava の Function について コードの違いを書いた
その発展として単機能の Function を合成して文字列を加工してみた。

以下はそのメモ。

目次

1. サンプルプログラムの出力

リスト内の文字列を以下のように加工する。

  1. 文字列にプレフィックスを付与する
  2. プレフィックスを付与した文字列をダブルクォートで囲む

サンプルプログラムの出力結果を載せておくと、以下のリストを、

BEFORE=[abc, def, ghi]

このように加工してみる。

AFTER=["prefix_abc", "prefix_def", "prefix_ghi"]

2. GoogleGuava の Function を使った合成

プレフィックスを付与する Function は以下の通り。

/**
 * {@code word} の前に {@code prefix} を付与する {@link Function} 。
 *
 * @param prefix プレフィックス。{@code null} は許容しない。
 * @return
 */
public Function<String, String> prefix(@NonNull final String prefix) {
    return new Function<String, String>() {

        @Override
        public String apply(String word) {
            return prefix + word;
        }

    };
}

続いて、ダブルクォートで囲む Function は以下の通り。

/**
 * {@code word} を {@code enclosed} で囲む {@link Function} 。
 *
 * @param enclosed 囲み文字。{@code null} は許容しない。
 * @return
 */
public Function<String, String> enclose(@NonNull final String enclosed) {
    return new Function<String, String>() {

        @Override
        public String apply(String word) {
            return enclosed + word + enclosed;
        }
    };
}

GoogleGuava の場合 Function を合成するには Functions#compose(Function<B,C> g, Function<A,? extends B> f) を使用する。

Functions#compose() を使用すると gf が合成されて Function<A,C> となる。

今回のサンプルでは、、、

  1. 文字列にプレフィックスを付与する
  2. プレフィックスを付与した文字列をダブルクォートで囲む

と合成したいので Functions#compose() を使った合成は以下のように書ける。

List<String> words = Arrays.asList("abc", "def", "ghi");

Function<String, String> compose = Functions.compose(enclose("\""), prefix("prefix_"));
  // 第1引数と第2引数の順番に注意
FluentIterable.from(words).transform(compose).toList();

実行結果は上記の通りになる。

Guava の Functions#compose() は、合成したい順番とは逆に Function を指定していく。
慣れの問題だが少々違和感がある。

3. Java8 の Function を使った合成

続いて Java8 の Function を使った合成。
Guava 版と同様に 使用する Function のコードから。

プレフィックスを付与する Function は以下の通り。

final Function<String, Function<String, String>> prefix = prefix -> word -> prefix + word;

ダブルクォートで囲む Function は以下の通り。

final Function<String, Function<String, String>> enclose = enclosed -> word -> enclosed + word + enclosed;

Java8 の Function には他の Function と合成するメソッド Function#andThen()Function 自体に定義されている。

この Function#andThen() を使った合成は以下のように書ける。

List<String> words = Arrays.asList("abc", "def", "ghi");

words.stream().map(prefix.apply("prefix_").andThen(enclose.apply("\""))).collect(Collectors.toList());

実行結果は上記の通りになる。

Java8 のほうが手順通りに Function を指定していくので分かりやすい。

4. 更新履歴

  • 2015/10/04: 初版作成

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

no image

Spark を使って JSON を返すシンプルな API を書いてみた

必要に迫られてモックの API を作成することになった。 大した工数を割けないので使ったことのある

記事を読む

no image

プロセスの起動を確認するプログラム

プロセスが起動しているかを確認するプログラムを Java で書いてみました。Excel のプロセス確

記事を読む

no image

google-gson でシリアライズ・デシリアライズしたサンプル

これまで Java で JSON を扱うときは JSONIC を使っていたが、google-gson

記事を読む

no image

サーブレットでクラスパス上にあるプロパティファイルを参照するスニペット

よく使うわりにはいつも調べているのでいい加減メモすることにした。 "app.proper

記事を読む

no image

Stream#filter()で絞り込みmap()で処理するコードスニペット

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

icatch-thumbnail

レスポンスにサムネイル画像を返す API のサンプル

今回は直接 ImageMagick は関係ありませんが、また画像ネタです。この辺りのことを仕事で扱っ

記事を読む

no image

Google Guava の Function を使った文字列加工の FluentIterable サンプル

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

メソッドの冒頭で条件チェックを行い、条件を満たしていない場合はさっさと return してしまう「ガ

記事を読む

icatch_2185253176-resized

Java8 の Optional 型を返す Generics を使ったメソッドを定義する

Java8 の Optional とガード節 に続いて Java8 の Optional ネタ。今回

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


六 × 1 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑