设为首页 收藏本站
查看: 2747|回复: 0

[经验分享] Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

[复制链接]

尚未签到

发表于 2017-12-24 17:22:20 | 显示全部楼层 |阅读模式
前言
  前面已经学习了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>  
{
  

  
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>  
{
  

  
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>  
{
  

  
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<?>>
  
for (Object>  
{
  
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427581-1-1.html 上篇帖子: 配置apache允许所有ip访问 下篇帖子: Windows apache虚拟主机配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表