あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

Google guava-libraries の Function Predicate Joiner

Function

Function で List の要素を変換して、ループの記述無しで新しい List を作成する。
変換する条件は Function の applyメソッドに記述する。

import java.util.List;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;

public class test {
    public static void main(String[] argv) {
        final List<Integer> list1 = Lists.newArrayList(5, 6, 7, 8);
        final List<String> list2 = Lists.transform(list1,
                    new Function<Integer,String>() {
            public String apply(Integer src) {
                return "foo" + (src > 4 ? src - 4 : src);
            }
        });
        System.out.println(Joiner.on(", ").join(list2));
    }
}

Joiner.on(セパレータ).join(リスト) でリストの要素を指定セパレータで区切った文字列を返す。

実行結果

foo1, foo2, foo3, foo4

Predicate

Predicate で List にフィルターをかける。
フィルターの条件は Predicate の applyメソッドに記述する。(フィルター処理部分を関数化)

import java.util.List;
import com.google.common.base.Predicate;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Iterables;

public class test2 {
    public static void main(String[] argv) {
        final List<String> list = Lists.newArrayList(null, "foo2", "bar1", null, "foo5");
        final Iterable<String> foo = Iterables.filter(list, new Predicate<String>() {
            public boolean apply(String src) {
                return src != null && src.startsWith("foo");
            }
        });
        System.out.println(Joiner.on(": ").join(foo));

        final Iterable<String> bar = Iterables.filter(list, new Predicate<String>() {
            public boolean apply(String src) {
                return src == null || src.startsWith("bar");
            }
        });
        System.out.println(Joiner.on(": ").useForNull("bar99").join(bar));
    }
}

Joiner.on(セパレータ).useForNull(nullの時の出力文字列).join(リスト) で
リストの要素(nullの時に指定文字列に置き換え)を指定セパレータで区切った文字列を返す。

実行結果

foo2: foo5
bar99: bar1: bar99

Lists Collections2 Sets Iterables Maps にある指定可能な static メソッドで使える。