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

関連記事

icatch-zip_524574337_mini-thumbnail

Java でファイルが1つだけ圧縮された zip を解凍するサンプル

ファイルが1つだけ圧縮された zip を解凍するサンプルです。 単一ファイルが圧縮された zip

記事を読む

no image

Java から VBScript を使って Excel を印刷する

背景 Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

GradleLogoReg

SDKMAN!(GVM) を使って Mac に Gradle をインストールする

長らく Java のアプリ開発には Maven を使ってきたが、時代に取り残されている感じがするので

記事を読む

GradleLogoReg

Gradle で Java アプリのプロジェクトを作成して Eclipse にインポートするまでの手順

Mac に SDKMAN! を使って Gradle をインストールしたので、実際にプロジェクトを作成

記事を読む

no image

画像ファイルを選別するFilenameFilter

画像ファイルのみアップロードを許可する仕様があって、何てことはないがフィルターを作って対応したのでメ

記事を読む

no image

ファイルに関するユーティリティ

ファイルに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。 作成

記事を読む

no image

Jetty でシンプルなプロジェクトを作成してみた

プロトタイプを作成するなら Tomcat よりも Jetty のほうがさらっと出来そうだなぁ、と今さ

記事を読む

medium_182531101

ClassLoader を使って getResourceAsStream で取得したファイルを UTF-8 で読み込む

よく使う割には覚えられず毎回調べている気がするので備忘録としてメモしておきます。 文字コードを指定し

記事を読む

Googleアドセンス用(PC)

Message

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


+ 四 = 6

次の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 ↑