google guava的函數編程部分Demo實例(註釋詳盡)

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();
		}
	}

}
相關文章
相關標籤/搜索