Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)
阿新 • • 發佈:2018-12-20
-
BeanUtils
簡單介紹下兩個方法的使用,populate和copyProperties,
populate可以幫助我們把Map裡的鍵值對值拷貝到bean的屬性值中;
copyProperties,顧名思義,幫我們拷貝一個bean的屬性到另外一個bean中,注意是淺拷貝
如下示例:
package apache.commons.beanutils.example.utils; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import apache.commons.beanutils.example.pojo.User; public class BeanUtilsTest { public static void main(String[] args) throws IllegalAccessException, InvocationTargetException { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "001"); //map.put("address", "hz"); map.put("id", "100"); map.put("state", false); map.put("others", "others"); User u = new User(); BeanUtils.populate(u, map); System.out.println(u); User u1 = new User(); BeanUtils.copyProperties(u1, u); System.out.println(u1); } }
-
ConvertUtils
實際上,BeanUtils是依賴ConvertUtils來完成實際山的型別轉換,但是有時候我們可能需要自定義轉換器來完成特殊需求的型別轉換;
自定義型別轉換器步驟:
1、定義一個實現類實現Converter介面
2、呼叫ConvertUtils.register方法,註冊該轉換器
如下是一個例項,我們會在字串轉換的時候,加上一個字首:
package apache.commons.beanutils.example.utils; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; import apache.commons.beanutils.example.pojo.User; public class CustomConverters { public static void main(String[] args) throws IllegalAccessException, InvocationTargetException { ConvertUtils.register(new StringConverter(), String.class); Map<String, String> map = new HashMap<String, String>(); map.put("name", "001"); map.put("address", "hz"); map.put("id", "100"); map.put("state", "false"); User u = new User(); BeanUtils.populate(u, map); System.out.println(u); } } class StringConverter implements Converter { /** * * * @see org.apache.commons.beanutils.Converter#convert(java.lang.Class, java.lang.Object) * @param type * @param value * @return */ @SuppressWarnings("unchecked") @Override public <T> T convert(Class<T> type, Object value) { if(String.class.isInstance(value)){ return (T) ("###" + value); }else{ return (T) value; } } }
這裡有一點需要注意,像BeanUtils
, ConvertUtils
和 PropertyUtils工具類都是共享同一個轉換器的,這樣子雖然用起來很方便,但有時候顯得不夠靈活,實際上
BeanUtils
, ConvertUtils
和 PropertyUtils都有一個對應的可例項化的類,即BeanUtilsBean、ConvertUtilsBean、PropertyUtilsBean;
它們的功能與BeanUtils
, ConvertUtils
和 PropertyUtils類似,區別是它們可以例項化,而且每個例項都可以擁有自己的型別轉換器;
-
CollectionUtils
顧名思義,集合工具類,只不過它操作的都是集合裡的bean,
利用這個工具類,我們可以批量修改、查詢、過濾集合中的bean,甚至還可以拷貝集合中所有bean的某個屬性到另外一個集合中,有點Java 8新特性 Streams 的感覺
如下示例:
package apache.commons.beanutils.example.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.beanutils.BeanPropertyValueChangeClosure;
import org.apache.commons.beanutils.BeanPropertyValueEqualsPredicate;
import org.apache.commons.beanutils.BeanToPropertyValueTransformer;
import org.apache.commons.collections.CollectionUtils;
import apache.commons.beanutils.example.pojo.User;
public class CollectionUtilsTest
{
public static void main(String[] args)
{
List<User> userList = new ArrayList<User>();
User u1 = new User();
u1.setId(1l);
u1.setName("chenpi1");
u1.setState(true);
User u2 = new User();
u2.setId(2l);
u2.setName("chenpi2");
User u3 = new User();
u2.setId(3l);
u2.setName("chenpi3");
u2.setState(true);
userList.add(u1);
userList.add(u2);
userList.add(u3);
//批量修改集合
BeanPropertyValueChangeClosure closure = new BeanPropertyValueChangeClosure("name",
"updateName");
CollectionUtils.forAllDo(userList, closure);
for (User tmp : userList)
{
System.out.println(tmp.getName());
}
BeanPropertyValueEqualsPredicate predicate =
new BeanPropertyValueEqualsPredicate( "state", Boolean.TRUE );
//過濾集合
CollectionUtils.filter( userList, predicate );
for (User tmp : userList)
{
System.out.println(tmp);
}
//建立transformer
BeanToPropertyValueTransformer transformer = new BeanToPropertyValueTransformer( "id" );
//將集合中所有你user的id傳輸到另外一個集合上
Collection<?> idList = CollectionUtils.collect( userList, transformer );
for (Object id : idList)
{
System.out.println(id);
}
}
}