zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MytBatis错题分析
    Spring核心概念
    延迟与缓存
    MyBatis的关联查询
    Mabatis注解
    [leetcode]226. Invert Binary Tree翻转二叉树
    [leetcode]633. Sum of Square Numbers平方数之和
    [leetcode]296. Best Meeting Point最佳见面地点
    [leetcode]412. Fizz Buzz报数
    [leetcode]142. Linked List Cycle II找出循环链表的入口
  • 原文地址:https://www.cnblogs.com/chenpi/p/6920896.html
Copyright © 2011-2022 走看看