Suppliers.memoizeの引数に
Supplierインタフェースの実装クラスを設定する事で、
Suppilerのgetの結果をキャッシュする事ができます。
Supplierで複雑な計算をさせて、その値をキャッシュするため、計算は1度で済みます。
以下サンプルコードです。
class FibonacciSup implements Supplier<Integer> {
@Override
public Integer get() {
System.out.println("compute start");
return fibonacci(10);
}
private Integer fibonacci(Integer n) {
if(n == 0) {
return 0;
} else if(n == 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
}
キャッシュされているかを確かめるため、get()の直後にprintln文を挿入しました。
以下のコードで呼び出します。
Supplier<Integer> sup = Suppliers.memoize(new FibonacciSup());
System.out.println(sup.get());
System.out.println(sup.get());
出力は以下の通りです。
compute start
55
55
フィボナッチ数の計算結果55が最初でキャッシュされたため、get()が一度しか呼び出されない事が、
"compute start"が一度しか出力されない事で証明できたと思います。
最終更新:2014年01月12日 15:57