1. 程式人生 > >Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

  • 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;
        }
        
    }  
}

這裡有一點需要注意,像BeanUtilsConvertUtils 和 PropertyUtils工具類都是共享同一個轉換器的,這樣子雖然用起來很方便,但有時候顯得不夠靈活,實際上BeanUtilsConvertUtils 和 PropertyUtils都有一個對應的可例項化的類,即BeanUtilsBean、ConvertUtilsBean、PropertyUtilsBean;

它們的功能與BeanUtilsConvertUtils 和 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);
        }
    }
}