CollectionUtils.select用法
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.Transformer;
public class UserTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
User user0 = new User();
user0.setPassword("1111");
user0.setUsername("haha");
userList.add(user0);
User user1 = new User();
user1.setPassword("1111");
user1.setUsername("heihei");
userList.add(user1);
User user2 = new User();
user2.setPassword("2222");
user2.setUsername("lala");
userList.add(user2);
// 這是在演示:集合內取出物件,取出的物件的屬性是特定值
// 這個方法的正向概念上當然是取出符合要求的物件集合,
// 但反向概念上,也就是刪除集合內符合要求的物件,只要在evaluate方法的返回值上加個感嘆號即可。
// .................................................
// 如果不用這個方法來達到刪除效果,我們會怎麼樣做呢?
// 估計是使用userList.remove(Object o),使用這個方法呢,就要重寫User的equals方法,
// 並且equals裡面只定義password的比對,然後在此處new一
// 個User並且設定進password為"1111",然後傳入此方法。
// 這樣做也可以達到效果,但影響長遠,影響了整個User
// 物件整個的使用,並且因為此處的依賴原因,equals方法將不能再做任何修改
// 而在專案中,如果後來者不知道此處對equals的依賴而改了equals,那你就要悲劇。
userList = (List<User>) CollectionUtils.select(userList,
new Predicate() {
public boolean evaluate(Object arg0) {
User u = (User) arg0;
return "1111".equals(u.getPassword());
}
});
// ....現在,userList中指剩下user0,user1了,咱繼續
// 這是在演示:集合內取出物件某屬性值的集合
// 也是集合操作很實用的方法,要不還要自己迴圈集合去取某屬性值,然後add進事先new的list中,麻煩
List<String> userNameList = (List<String>) CollectionUtils.collect(
userList, new Transformer() {
public Object transform(Object arg0) {
User u = (User) arg0;
return u.getUsername();
}
});
// 好了,如果沒錯,那userNameList就是"haha"和"heihei"2個字串了,瞧瞧效果吧
System.out.println(userNameList);
}
}