Apache Commons Beanutils 三 (BeanUtilsConvertUtilsCollectionUtils...)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Commons Beanutils 三 (BeanUtilsConvertUtilsCollectionUtils...)相关的知识,希望对你有一定的参考价值。
前言
前面已经学习了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工具类都是共享同一个转换器的,这样子虽然用起来很方便,但有时候显得不够灵活,实际上
BeanUtils
, ConvertUtils
和 PropertyUtils都有一个对应的可实例化的类,即BeanUtilsBean、ConvertUtilsBean、PropertyUtilsBean;
它们的功能与BeanUtils
, ConvertUtils
和 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); } } }
参考资料
源码
https://github.com/peterchenhdu/apache-commons-beanutils-example
以上是关于Apache Commons Beanutils 三 (BeanUtilsConvertUtilsCollectionUtils...)的主要内容,如果未能解决你的问题,请参考以下文章
使用火焰图分析org.apache.commons.beanutils.BeanUtils
Apache Commons Beanutils教程一(访问Bean属性)
Apache Commons Beanutils 三 (BeanUtilsConvertUtilsCollectionUtils...)