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

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

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

記事を読む

medium_2055608272

指定した年月の日付を Calendar オブジェクトの一覧で取得する

小ワザです。 業務で、指定した年月の日付を Calendar オブジェクトの一覧で取得する必要があり

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

icatch_2185253176-resized

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

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

記事を読む

no image

Stream#map()とStream#collect()を使ってListを生成する

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

記事を読む

no image

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

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

記事を読む

GradleLogoReg

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

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

記事を読む

no image

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

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

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

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

記事を読む

Googleアドセンス用(PC)

Message

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


× 5 = 三十

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