しかだよ。Guavaってライブラリが良いってインターネットに書いてたので調べてみたよ。 サンプルソースのほとんどは本家からコピペしたよ。
guava-libraries - Guava: Google Core Libraries for Java 1.6+ - Google Project Hosting
nullぽを避けるための仕組み
{% highlight java %}
Optional
引数の値チェックなど、前提条件をチェックする仕組み。assertとかに似てると思う。 条件がfalseだと対応するExceptionがスローされる。
Comparatorをスマートにしたやつ。Comparatorはめんどいよね・・・。
{% highlight java %}
Ordering
if (Ordering.from(comparator).reverse().isOrdered(list)) { ... }
{% endhighlight %} あら素敵。
なにやら便利メソッド。
nullぽを気にせずnullチェックができるよ。
{% highlight java %} Objects.equal("a", "a"); // returns true Objects.equal(null, "a"); // returns false Objects.equal("a", null); // returns false Objects.equal(null, null); // returns true
安全なハッシュが簡単に作れます。 {% highlight java %} Objects.hashCode(Object...)
toStringメソッドの構築・保守が楽になるよ。 {% highlight java %} @override public String toString(){ // Returns "ClassName{x=1}" return Objects.toStringHelper(this) .add("x", this.x)//変数名とその値 .toString(); //or // Returns "MyObject{x=1}" return Objects.toStringHelper("MyObject") .add("x", 1) .toString(); } {% endhighlight %} eclipseのジェネレーターでもいいと思うけど。
ComparisonChainを使うと、連続した比較が簡単に。 {% highlight java %} public int compareTo(Foo that) { return ComparisonChain.start() .compare(this.aString, that.aString) .compare(this.anInt, that.anInt) .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) .result(); }
case文のように、連鎖したtry catch文が書けるようになります。 例えば、以下の処理で IKnowWhatToDoWithThisException が発生した場合、1 2 3 の順番で処理が発生します。 {% highlight java %} try { // 1 someMethodThatCouldThrowAnything(); } catch (IKnowWhatToDoWithThisException e) { // 2 handle(e); } catch (Throwable t) { // 3 Throwables.propagateIfInstanceOf(t, IOException.class); Throwables.propagateIfInstanceOf(t, SQLException.class); throw Throwables.propagate(t); } {% endhighlight %} java7だと簡潔に書けるけど、Androidとかはまだ使えないからありがたいね。
不変のコレクションを作りたい時に扱う。防御的コピー(defensive copy)したい時とかに便利。
{% highlight java %}
public static final ImmutableSet
class Foo {
Set<Bar> bars;
Foo(Set<Bar> bars) {
this.bars = ImmutableSet.copyOf(bars); // defensive copy!
}
}
{% endhighlight %}
コレクション型の追加
例えば、要素の中に特定の単語がいくつ含まれるかを検出できる。
{% highlight java %}
Multiset
1つのkeyに対して、valueがたくさんaddできます。
{% highlight java %}
Set
BindingMapの略かな?Mapに保持する値と取り出して利用している値で整合性が保ちやすくする仕組み。 mapのkeyに値が紐付いているのにputした場合、IllegalArgumentExceptionが発生する。 削除する時はforcePutメソッドを利用する。 ※よく分かってない
行と列の構造を持ったコレクション。2次元配列とが違い、行からも列からもアクセスできる。
クラスの型をキーにする、変わったMapです。(使い道が思い浮かばない)
範囲のコレクション。
java6必須。GWTは非対応。
Collection操作のユーティリティ
{% highlight java %}
List
{% highlight java %}
List
配列の初期化みたいに自由に追加できる。
{% highlight java %}
Set
guavaはCollectionよりIterableなのが好きらしい。
{% highlight java %}
Iterable
String lastAdded = Iterables.getLast(myLinkedHashSet);
String theElement = Iterables.getOnlyElement(thisSetIsDefinitelyASingleton); // if this set isn't a singleton, something is wrong!
その他、Collectionの便利クラスが色々。
デザインパターンの decorator pattern が簡単に実装できる仕組み。 以下のサンプルだと addにlogの処理をdecorateしている。
{% highlight java %}
class AddLoggingList
Iteratorで次の要素を見たいけどindexを進めたくない時に使うpeekメソッドが拡張されている。
{% highlight java%}
List
独自のイテレーターを楽に実装する。
{% highlight java%}
public static Iterator
いきなりサンプルである。
{% highlight java %}
LoadingCache