首页 > 代码库 > Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

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

前言

前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUtils;

BeanUtils

简单介绍下两个方法的使用,populate和copyProperties,

populate可以帮助我们把Map里的键值对值拷贝到bean的属性值中;

copyProperties,顾名思义,帮我们拷贝一个bean的属性到另外一个bean中,注意是浅拷贝

如下示例:

/* * File Name: BeanUtilsTest.java * Description:  * Author: http://www.cnblogs.com/chenpi/ * Create Date: 2017年5月30日 */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;/** *  * @author    http://www.cnblogs.com/chenpi/ * @version   2017年5月30日 */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方法,注册该转换器

如下是一个实例,我们会在字符串转换的时候,加上一个前缀:

/* * File Name: CustomConverters.java * Description:  * Author: http://www.cnblogs.com/chenpi/ * Create Date: 2017年5月30日 */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;/** *  * @author    http://www.cnblogs.com/chenpi/ * @version   2017年5月30日 */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工具类都是共享同一个转换器的,这样子虽然用起来很方便,但有时候显得不够灵活,实际上BeanUtilsConvertUtils 和 PropertyUtils都有一个对应的可实例化的类,即BeanUtilsBean、ConvertUtilsBean、PropertyUtilsBean;

它们的功能与BeanUtilsConvertUtils 和 PropertyUtils类似,区别是它们可以实例化,而且每个实例都可以拥有自己的类型转换器;

CollectionUtils

顾名思义,集合工具类,只不过它操作的都是集合里的bean,

利用这个工具类,我们可以批量修改、查询、过滤集合中的bean,甚至还可以拷贝集合中所有bean的某个属性到另外一个集合中,有点Java 8新特性 Streams 的感觉

如下示例:

/* * File Name: CollectionUtilsTest.java * Description:  * Author: http://www.cnblogs.com/chenpi/ * Create Date: 2017年5月30日 */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;/** *  * @author http://www.cnblogs.com/chenpi/ * @version 2017年5月30日 */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);        }    }}

参考资料

http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.3/apidocs/org/apache/commons/beanutils/package-summary.html

源码

https://github.com/peterchenhdu/apache-commons-beanutils-example

 

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