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#map()とStream#collect()を使ってListを生成する

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

記事を読む

icatch-zip_524574337_mini-thumbnail

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

GradleLogoReg

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

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

記事を読む

icatch-3361b5e1-resized

Optional型の変数にget()とifPresent()は使わない

Java8 から導入された Optional を勉強するため、過去にプライベートで書いたコードに O

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

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 ↑