package org.loda.guava; import java.util.Map; import java.util.Set; import org.junit.Assert; import org.junit.Test; import com.google.common.base.Function; import com.google.common.base.Functions; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.collect.Maps; import com.google.common.collect.Sets; /** * * @ClassName: FunctionProgramming * @Description: guava之函數編程 * @author minjun * @date 2015年6月14日 下午7:06:43 * */ @SuppressWarnings("unused") public class FunctionProgramming { /** * * @Title: testFunction * @Description: Fucntion<K,V>接口提供的apply是用來將對象K轉換爲對象V的 * @param 設定文件 * @return void 返回類型 * @throws */ @Test public void testFunction() { // 將map存儲進Function實現類中 Function<String, Classroom> lookup = getFunctionForDefaultMap(); Function<Classroom, String> append = new Function<Classroom, String>() { @Override public String apply(Classroom input) { return Joiner.on(",").join(input.students); } }; // 先調用lookup.apply("三年級二班")查詢班級,而後將該對象繼續apply('三年二班的對象'),用逗號鏈接該班級中的學生名字 Function<String, String> compose = Functions.compose(append, lookup); Assert.assertEquals("tom,jack", compose.apply("三年級二班")); } private Function<String, Classroom> getFunctionForDefaultMap() { Map<String, Classroom> map = Maps.newHashMap(); map.put("三年級二班", new Classroom(1, "三年級二班", Sets.newHashSet("jack", "tom"))); map.put("四年三班", new Classroom(2, "四年三班", Sets.newHashSet("owen", "jerry"))); return Functions.forMap(map); } private class Classroom { private int id; private String name; private Set<String> students; public Classroom() { } public Classroom(int id, String name, Set<String> students) { super(); this.id = id; this.name = name; this.students = students; } } /** * * @Title: testPredicate * @Description: 不一樣於Function的apply改變對象,Predicate<T>是用來過濾對象T的 * @param 設定文件 * @return void 返回類型 * @throws */ @Test public void testPredicate() { Classroom c1 = new Classroom(1, "三年級二班", Sets.newHashSet("jack", "tom", "kelly")); Classroom c2 = new Classroom(2, "四年三班", Sets.newHashSet("owen", "jerry")); Classroom c3 = new Classroom(3, "六年二班", Sets.newHashSet("jobs")); // 學生數量大於1 Predicate<Classroom> number = new Predicate<Classroom>() { @Override public boolean apply(Classroom input) { return input.students.size() > 1; } }; // 學生id小於3 Predicate<Classroom> id = new Predicate<Classroom>() { @Override public boolean apply(Classroom input) { return input.id < 3; } }; // 當過濾條件可以讓number和id同時成立的時候(學生數量大於1而且學生id小於3的班級是否是c1),返回true Assert.assertTrue(Predicates.and(number, id).apply(c1)); // 用新的數據填充map,並注入lookup函數 Function<String, Classroom> lookup = getFunctionForDefaultMap(); // 判斷三年級二班的學生數量是否大於1 Assert.assertTrue(Predicates.compose(number, lookup).apply("三年級二班")); } @Test public void testSupplier() { // 使用memorize包裝以後的Supplier,之後再從這個裏面get()對象的時候,都能保證是同一個對象 Supplier<Classroom> wrapped = Suppliers .memoize(new ClassroomSupplier()); // 指定保持這個單例對象的時間,一旦過時,就會從新生成新的對象 // Supplier<Classroom> w = Suppliers // .memoizeWithExpiration((new ClassroomSupplier()), 10L, // TimeUnit.MINUTES); Classroom c1 = wrapped.get(); Classroom c2 = wrapped.get(); Assert.assertEquals(c1, c2); } private class ClassroomSupplier implements Supplier<Classroom> { @Override public Classroom get() { return new Classroom(); } } }