Google Guava の Function を使った文字列加工の FluentIterable サンプル
公開日:
:
最終更新日:2015/10/02
Java GoogleGuava, Java8
お客様の都合上 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)
関連記事
-
-
画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット
File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画
-
-
Stream#map()とStream#collect()を使ってListを生成する
Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン
-
-
ディレクトリに関するユーティリティ
ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。
-
-
Java8 の Optional とガード節
メソッドの冒頭で条件チェックを行い、条件を満たしていない場合はさっさと return してしまう「ガ
-
-
Stream#filter()で絞り込みmap()で処理するコードスニペット
Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン
-
-
保存ダイアログを表示させてファイルをダウンロードさせる方法
例えば、ブラウザに表示している画像は右クリックを使ってダウンロードできますが、左クリックから保存ダイ
-
-
Optional型の変数にget()とifPresent()は使わない
Java8 から導入された Optional を勉強するため、過去にプライベートで書いたコードに O
-
-
SDKMAN!(GVM) を使って Mac に Gradle をインストールする
長らく Java のアプリ開発には Maven を使ってきたが、時代に取り残されている感じがするので
-
-
Java でファイルが1つだけ圧縮された zip を解凍するサンプル
ファイルが1つだけ圧縮された zip を解凍するサンプルです。 単一ファイルが圧縮された zip
-
-
Java8 の Optional 型を返す Generics を使ったメソッドを定義する
Java8 の Optional とガード節 に続いて Java8 の Optional ネタ。今回