Collectパッケージ
よく使うパッケージです。配列とかに関して
インターフェース
マルチマップとは、複数の値を1つのキーで所持できます。
クラス
カテゴリー | 分類されるクラス |
---|---|
Guavaデータクラス | Table・Multiset・Multimap・BiMapの実装クラス |
木構造 | TreeTraverser・BinaryTreeTraverser |
ユーティリティー | Collections2・Interners・Lists |
フォワーディング系 | Fowarding系クラス |
イミュータブル系 | Immutable系クラス |
その他 | 当てはらないクラス |
Guavaデータクラス
ArrayListMultimap
ArrayListを使ったマルチマップ collect.MapConstraints - Mapに値がputされた時、チェックできるようにします。
ConcurrentHashMultiset
コンカレントなHashマルチセット
ユーティリティー
Collections2
Collectionのユーティリティー (java.util.Collectionsがあるので、Collections2)
- filter - Collectionをpredicateに渡す
- transform - Collectionをfunctionに渡す
- permutations - 順列(異なる並び順)を作成
Interners
String.intern()のようなことをするInternerのユーティリティー
newStrongInternerの中身
public static <E> Interner<E> newStrongInterner() {
final ConcurrentMap<E, E> map = new MapMaker().makeMap();
return new Interner<E>() {
@Override public E intern(E sample) {
E canonical = map.putIfAbsent(checkNotNull(sample), sample);
return (canonical == null) ? sample : canonical;
}
};
}
newWeakInternerというGWT未対応
というメソッドもある
MapConstrains
MapConstrainのためのユーティリティー
MapConstrainはマップのキーと値が正しいかどうかを、調べるためのinterface
public void checkKeyValue(Object key, Object value) {
if (key == null || value == null) {
throw new NullPointerException();
}
}
ObjectArrays
配列を操作、引数がClassのものはGWT未対応
追加するconcatなどがある
木構造
データーを簡単に指定の順番(行きがけ順、通りがけ順、帰りがけ順)で探索(トラバース)する
abstractを実装するだけで、Iterableが返ってくる。
BinaryTreeTraverser
バイナリツリー二分木用 leftChild(T root)・rightChild(T root)を実装する
TreeTraverser
普通のツリー構造用
children(T root)を実装する
当てはらないクラスの解説
AbstractIterator
簡単にIteratorを拡張可能
nullをskipする例 via JavaDoc
public static Iterator<String> skipNulls(final Iterator<String> in) {
return new AbstractIterator<String>() {
protected String computeNext() {
while (in.hasNext()) {
String s = in.next();
if (s != null) {
return s;
}
}
return endOfData();
}
};
}
AbstractSequentialIterator
プログラムで制御する前回の値を元に次の値を返すIteratorを作成可能
nullを返すと終了
一定値まで延々と値を2倍していく via JavaDoc
Iterator<Integer> powersOfTwo =
new AbstractSequentialIterator<Integer>(1) {
protected Integer computeNext(Integer previous) {
return (previous == 1 << 30) ? null : previous * 2;
}
};
ComparisonChain
比較を簡単に作れる。
他の手軽に作れる系だと、Objects.ToStringHelperがある。
例 via javadoc
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();
}
ContiguousSet
範囲の値を網羅したSetを返す
Range<Integer> nums=Range.closed(1, 10);
ContiguousSet<Integer> numSets=ContiguousSet.create(nums, DiscreteDomain.integers());
LogUtils.log(Joiner.on(",").join(numSets));//return 1,2,3,4,5,6,7,8,9,10
DiscreteDomain
ContiguousSetで使う、指定値の前後の値を返す
4096色を表示する例
public class WebColorDiscreteDomain extends DiscreteDomain<String>{
@Override
public String next(String value) {
checkArgument(isColorHex(value));
int color=toColor(value);
if(color<0xfff){
color++;
}else{
return null;
}
int[] rgb=colorToRGB(color);
String hex=rgbToString(rgb);
return hex;
}
@Override
public String previous(String value) {
checkArgument(isColorHex(value));
int color=toColor(value);
if(color>0){
color--;
}else{
return null;
}
int[] rgb=colorToRGB(color);
return rgbToString(rgb);
}
@Override
public long distance(String start, String end) {
checkArgument(isColorHex(start) && isColorHex(end));
int[] startRGB=toRGB(start);
int[] endRGB=toRGB(end);
//somehow end minus start
return (endRGB[0]<<8 & endRGB[1]<<4 & endRGB[2]) - (startRGB[0]<<8 & startRGB[1]<<4 & startRGB[2]);
}
public boolean isColorHex(String value){
return value.length()==4 && value.startsWith("#") && CharMatcher.JAVA_DIGIT.or(CharMatcher.inRange('A', 'F')).matchesAllOf(value.toUpperCase().substring(1));
}
private int[] colorToRGB(int color){
int[]rgb=new int[3];
rgb[0]=color>>8&0xf;
rgb[1]=color>>4 &0xf;
rgb[2]=color & 0xf;
return rgb;
}
private int toColor(String value){
return Integer.parseInt(value.substring(1), 16);
}
private int[] toRGB(String value){
int[] rgb=new int[3];
rgb[0]=Integer.parseInt(value.substring(1,2), 16);
rgb[1]=Integer.parseInt(value.substring(2,3), 16);
rgb[2]=Integer.parseInt(value.substring(3,4), 16);
return rgb;
}
//return #FFF Upper-case
private String rgbToString(int[] rgb){
String hex= new StringBuilder().append("#")
.append(Integer.toHexString(rgb[0]))
.append(Integer.toHexString(rgb[1]))
.append(Integer.toHexString(rgb[2])).toString().toUpperCase();
LogUtils.log(hex);
return hex;
}
}
FluentIterable - collect.FluentIterableを参照
Iterable操作の集大成
MapMaker
コンカレントマップを作る
GWTで使用する時
moduleに以下行を追加
<inherits name="com.google.common.collect.Collect"/>