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

公開日: : 最終更新日:2015/10/02 Java ,

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか Stream が羨ましいので、GoogleGuava を使って Java8 の真似事みたいなことをしている。

今後も別案件で GoogleGuava を使うことがあるかもしれないのでスニペットを残しておく。
加えて、同じことを Java8 でも書いてみたのでそれも残しておく。

目次

1. Function を使って文字列を加工する FluentIterable

文字列を格納したリストがあり、それら文字列を一括して同じルールで加工するというサンプル。
例として、文字列をダブルクォートで囲んでみる。

加工前と加工後のリストは以下のようになる。

BEFORE=[abc, def, ghi]
AFTER=["abc", "def", "ghi"]

Java8 の Stream#of() の代わりになるものとして FluentIterable#from() を使う。
これを使うと Stream と同様に「中間処理」と「末端処理」を “.” で繋いで書けるようになる。

「中間処理」と「終端処理」のメソッドは以下が分かりやすい。

リストに格納されている文字列を加工する部分には FluentIterable#transform() を使う。
Stream#map() と同じように Function を引数に受け取るようになっている。

文字列をダブルクォートで囲む処理を GoogleGuava 版の Function で書くと次のようになる。

public Function<String, String> enclose(@NonNull final String enclosed) {
    return new Function<String, String>() {
        @Override
        public String apply(String word) {
            return enclosed + word + enclosed;
        }
    };
}

この Function を使ってリスト中の文字列を一括処理してみる。
こんな風に書ける。

List<String> words = Arrays.asList("abc", "def", "ghi");
FluentIterable.from(words).transform(enclose("\"")).toList();

Stream#map() と同じように書ける。

2. Java8 の Function を使った場合と比較する

Java8 の Function を使って同じことをやってみる。
やはり Java8 は簡潔に書ける。
IDE の力を借りてコードを書きはするのだが、それでもうれしい。

さて、Java8 の Function を使って一括処理したコードは以下の通り。

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

List<String> words = Arrays.asList("abc", "def", "ghi");
words.stream().map(enclose.apply("\"")).collect(Collectors.toList());

簡潔に書けすぎるのでたまに見失うことがあるし、一発でこのコードを書けないことがある。
そんなときは何も省略しない形から徐々に省略していくのだが、自分への備忘録としてその過程を残しておく。

以下は何も省略しない形。

final Function<String, Function<String, String>> enclose = (String enclosed) -> {
    Function<String, String> function = (String word) -> {
        return enclosed + word + enclosed;
    };
    return function;
};

次は returnで返す Function を変数に格納していたが、直接 return したパターン。

final Function<String, Function<String, String>> enclose = (String enclosed) -> {
    return (String word) -> {
        return enclosed + word + enclosed;
    };
}

次は Function の引数が String だと分かっているのでそこを省略したパターン。

final Function<String, Function<String, String>> enclose = (String enclosed) -> {
    return word -> {
        return enclosed + word + enclosed;
    };
};

次は return で返す Function は1行で書けるので中かっこを省略したパターン。

final Function<String, Function<String, String>> enclose = (String enclosed) -> {
    return word -> enclosed + word + enclosed;
}

次は Function の引数は String だと分かっているのでそこを省略したパターン。

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

次が最後。
return で返す Function は1行で書けるので中かっこを省略したパターン。

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

3. 更新履歴

  • 2015/10/01: 初版作成
  • 2015/10/02: 加工前と加工後のリストを追加

Googleアドセンス用(PC)

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

関連記事

no image

ディレクトリに関するユーティリティ

ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。

記事を読む

no image

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

Java8 と GoogleGuava の Function について コードの違いを書いた。 その

記事を読む

no image

Exec Maven Plugin で maven コマンドでアプリを起動する

packaging タグに "jar" を指定した Maven プロジェクトをコマンドラインから起動

記事を読む

icatch-thumbnail

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

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

記事を読む

medium_182531101

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

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

記事を読む

no image

画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット

File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画

記事を読む

icatch-zip_524574337_mini-thumbnail

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

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

記事を読む

GradleLogoReg

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

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

記事を読む

GradleLogoReg

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

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

記事を読む

medium_2055608272

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


7 × = 三十 五

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