精华内容
下载资源
问答
  • 2018-11-28 17:53:16

    问题场景:

      在实际开发中可能存在将两个对象合并为一个对象的需求,传统的方法当然是一个个get和set但是这样的代码很不整洁,我们可以基于反射去实现这一需求。所幸apache和spring都提供的有该方法。

    Spring:

    public static void copyProperties(Object source, Object target) throws BeansException {
    		copyProperties(source, target, null, (String[]) null);
    }

    该方法以target对象为主体,将source对象的值赋给target。默认是直接覆盖相同字段的全部值。

    实际需求中只需要复制部分属性,我们可以使用该方法,忽略部分字段

    public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
    		copyProperties(source, target, null, ignoreProperties);
    	}

    如:忽略已经有值的字段,

    public static String[] getValuePropertyNames (Object source) {
            final BeanWrapper src = new BeanWrapperImpl(source);
            java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
            Set<String> emptyNames = new HashSet<>();
            for(java.beans.PropertyDescriptor pd : pds) {
                Object srcValue = src.getPropertyValue(pd.getName());
                if (null != srcValue) emptyNames.add(pd.getName());
            }
            String[] result = new String[emptyNames.size()];
            return emptyNames.toArray(result);
        }

    该方法为获取所有有值的方法。当然也可以直接指定具体字段。

     

     

    apache:

    该方法为将orig方法的值赋给dest,但是不提供忽略覆盖的方法

    public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {
            BeanUtilsBean.getInstance().copyProperties(dest, orig);
        }

     

    更多相关内容
  • java实体对象合并方法

    2022-06-06 13:20:04
    在实际的开发工作中java对象合并还是比较实用的的一个功能,尤其是在牵扯到数据的更新和业务对象之间的转换的时候更是必要。在这里给大家分享一下我常用的合并对象的方法。 这个方法的逻辑就是以数据源对象的值为主...

    在实际的开发工作中java对象合并还是比较实用的的一个功能,尤其是在牵扯到数据的更新和业务对象之间的转换的时候更是必要。在这里给大家分享一下我常用的合并对象的方法。

    /**
    	 * 合并对象
    	 * 
    	 * @param sourceBean 数据源对象
    	 * @param targetBean 需要得到的对象
    	 * @return
    	 */
    	private static Object mergerData(Object sourceBean, Object targetBean) {
    		Field[] sourceFields = sourceBean.getClass().getDeclaredFields();
    		Field[] targetFields = targetBean.getClass().getDeclaredFields();
    		try {
    			for (int i = 0; i < sourceFields.length; i++) {
    				Field sourceField = sourceFields[i];
    				//这里遍历主要是为了适应双方对象属性顺序不一致的情况
    				for (int j = 0; j < targetFields.length; j++) {
    					Field targetField = targetFields[j];
    					if (sourceField.getName().equals(targetField.getName())) {
    						sourceField.setAccessible(true);
    						targetField.setAccessible(true);
    						if (!(sourceField.get(sourceBean) == null)) {
    							targetField.set(targetBean, sourceField.get(sourceBean));
    						}
    					}
    				}
    			}
    		} catch (IllegalArgumentException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		}
    		return targetBean;
    	}
    

    这个方法的逻辑就是以数据源对象的值为主进行更新的,对双方对象的顺序和数量没有要求,但是两个属性的名称必须一致。

    展开全文
  • 主要介绍了利用Java反射机制实现对象相同字段的复制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • java 中怎么合并同类对象的属性

    千次阅读 2021-02-12 16:09:10
    import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetEx...

    展开全部

    package cn.utils;

    import java.beans.BeanInfo;

    import java.beans.IntrospectionException;

    import java.beans.Introspector;

    import java.beans.PropertyDescriptor;

    import java.lang.reflect.InvocationTargetException;

    import java.sql.Timestamp;

    import java.text.ParseException;

    import java.text.SimpleDateFormat;

    import java.util.ArrayList;

    import java.util.Date;

    import java.util.Iterator;

    import java.util.List;

    import java.util.Map;

    import java.util.regex.Pattern;

    import org.apache.commons.beanutils.BeanUtils;public class ExtendObject {

    /**

    * 将相同类型的对象的内容62616964757a686964616fe59b9ee7ad9431333361323466向右合并

    * @param beanType 返回对象的类型

    * @param initObject 包含原始数据的对象

    * @param updateObject包含修改后数据的对象

    * @return返回两个对象的合并,相同属性的值如果convertedObject中包含,且不为null的话取它的值,否则取returnedObject的值

    */

    @SuppressWarnings("unchecked")

    public Object extendObject(Object beanType, Object initObject, Object updateObject){

    Map map1 = BeanToMap(initObject);

    Map map2 = BeanToMap(updateObject);

    List list = getMapKeySet(map1);

    for(int i=0; i

    if(null!=map2Value){

    map1.put(list.get(i), map2Value);

    }

    }

    return MapToBean(beanType, map1);

    }

    /**

    * 将map转化为bean

    * @param bean 将要转化成为的对象

    * @param map 被转化的map对象

    */

    @SuppressWarnings("unchecked")

    public Object MapToBean(Object bean,Map map){

    Object type = null;

    Date date = null ;

    try {

    type = bean.getClass().newInstance();

    BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());

    for(PropertyDescriptor p: beanInfo.getPropertyDescriptors()){

    String propertyName = p.getName();

    Object mapValue = map.get(propertyName);

    //去掉键为'class'的键值对

    if(null!=mapValue&&!"class".equals(propertyName)){

    //判断该字符转是否为日期类型

    if(CheckType.isDateType((String)mapValue)){

    String dateType = CheckType.getDateType((String)mapValue);

    if(dateType.equals("yyyy-MM-dd HH:mm:ss")){

    date = new SimpleDateFormat(dateType).parse((String)mapValue);

    p.getWriteMethod().invoke(type, new Timestamp(date.getTime()));

    }else{

    p.getWriteMethod().invoke(type, date);

    }

    //判断该字符串是否为整型,同时忽略值为数字,但是类型是字符串的Id们

    }else if(CheckType.isInt((String) mapValue)&&(!Pattern.matches("/w*Id", propertyName))){

    p.getWriteMethod().invoke(type, Integer.getInteger((String)mapValue).intValue());

    //默认剩下的类型都是字符串型

    }else{

    p.getWriteMethod().invoke(type, mapValue);

    }

    }

    }

    } catch (IntrospectionException e) {

    e.printStackTrace();

    } catch (InstantiationException e) {

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    } catch (IllegalArgumentException e) {

    e.printStackTrace();

    } catch (InvocationTargetException e) {

    e.printStackTrace();

    } catch (ParseException e) {

    e.printStackTrace();

    }

    return type;

    }

    /**

    * 将bean转化为map

    * @param object

    * @return

    */

    @SuppressWarnings("unchecked")

    public Map BeanToMap(Object object){

    Map map = null ;

    try {

    map = BeanUtils.describe(object);

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    } catch (InvocationTargetException e) {

    e.printStackTrace();

    } catch (NoSuchMethodException e) {

    e.printStackTrace();

    }

    return map;

    }

    /**

    * 获得对应Map的键值

    * @param map

    * @return

    */

    @SuppressWarnings("unchecked")

    public List getMapKeySet(Map map){

    List list = new ArrayList();

    Iterator iterator = map.keySet().iterator();

    while(iterator.hasNext()){

    list.add(iterator.next());

    }

    return list;

    }///**

    // * @param args

    // */

    //public static void main(String[] args) throws Exception{

    //System.out.println(isInt("1"));

    //Admin a = new Admin();

    //a.setAdminId("1");

    //a.setAdminPassword("1");

    //

    //Admin b = new Admin();

    //b.setAdminPassword("2");

    //Admin c = (Admin)extendObject(new Admin(),a,b);

    //System.out.println(c.getAdminId()+"----"+c.getAdminPassword());

    //}

    }

    ------------------------------------------------------------------------------------

    package cn.utils;

    import java.util.regex.Pattern;

    public class CheckType {

    /**

    * 判断该字符串是否为日期类型

    * @param str

    * @return

    */

    public static boolean isDateType(String str){

    Boolean b = false;

    String dateType1 ="/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2}./d*";

    String dateType2 ="/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2}";

    String dateType3 ="/d{4}-/d{2}-/d{2}";

    if(Pattern.matches(dateType1, str)||

    Pattern.matches(dateType2, str)||

    Pattern.matches(dateType3, str)){

    b = true;

    }

    return b;

    }/**

    * 返回字符串所属日期格式

    * @param str

    * @return

    */

    public static String getDateType(String str){

    String dateType1 ="/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2}./d*";

    String dateType2 ="/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2}";

    String dateType3 ="/d{4}-/d{2}-/d{2}";

    if(Pattern.matches(dateType1, str)||

    Pattern.matches(dateType2, str)){

    return"yyyy-MM-dd HH:mm:ss";

    }

    if(Pattern.matches(dateType3, str)){

    return"yyyy-MM-dd";

    }

    return null;

    }

    /**

    * 判断该字符串是否为整型

    * @param str

    * @return

    */

    public static boolean isInt(String str){

    Boolean b = false;

    if(Pattern.matches("/d+", str)){

    b = true;

    }

    return b;

    }

    }

    追问

    这个我在网上收到过,我要的是具有可扩展性的,不过还是谢谢你

    本回答由提问者推荐

    2Q==

    已赞过

    已踩过<

    你对这个回答的评价是?

    评论

    收起

    展开全文
  • JAVA两个对象属性合并

    万次阅读 2017-12-26 14:06:58
    import java.lang.reflect.Field; public class CombineBeans ... * @Description: 该方法是用于相同对象不同属性值的合并,如果两个相同对象中同一属性都有值, * 那么sourceBean中的值会覆盖tagetBean重点的值...
    import java.lang.reflect.Field;
    
    public class CombineBeans {
    
    	/**
    	 * @Title: combineSydwCore
    	 * @Description: 该方法是用于相同对象不同属性值的合并,如果两个相同对象中同一属性都有值,
    	 *               那么sourceBean中的值会覆盖tagetBean重点的值
    	 * @author: WangLongFei
    	 * @date: 2017年12月26日 下午1:53:19
    	 * @param sourceBean
    	 *            被提取的对象bean
    	 * @param targetBean
    	 *            用于合并的对象bean
    	 * @return targetBean 合并后的对象
    	 * @return: Object
    	 */
    	@SuppressWarnings("unused")
    	private Object combineSydwCore(Object sourceBean, Object targetBean) {
    		Class sourceBeanClass = sourceBean.getClass();
    		Class targetBeanClass = targetBean.getClass();
    
    		Field[] sourceFields = sourceBeanClass.getDeclaredFields();
    		Field[] targetFields = sourceBeanClass.getDeclaredFields();
    		for (int i = 0; i < sourceFields.length; i++) {
    			Field sourceField = sourceFields[i];
    			Field targetField = targetFields[i];
    			sourceField.setAccessible(true);
    			targetField.setAccessible(true);
    			try {
    				if (!(sourceField.get(sourceBean) == null)) {
    					targetField.set(targetBean, sourceField.get(sourceBean));
    				}
    			} catch (IllegalArgumentException | IllegalAccessException e) {
    				e.printStackTrace();
    			}
    		}
    		return targetBean;
    	}
    
    	// 测试 combineBeans方法
    	public static void main(String[] args) {
    		Student sourceModel = new Student(); // 第一个对象
    		Student targetModel = new Student(); // 第二个model对象
    
    		sourceModel.setSex("1");
    		sourceModel.setcName("张三");
    
    		targetModel.setSex("2");
    		targetModel.setcName("李四");
    		targetModel.setCardName("身份证");
    		targetModel.setCardNumber("222222222222222222222");
    
    		CombineBeans test = new CombineBeans();
    		test.combineSydwCore(sourceModel, targetModel);
    	}
    }
    
    
    public class Student {
    	private String sex;
    	private String cName;
    	private String cardName;
    	private String cardNumber;
    
    	public String getSex() {
    		return sex;
    	}
    
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    
    	public String getcName() {
    		return cName;
    	}
    
    	public void setcName(String cName) {
    		this.cName = cName;
    	}
    
    	public String getCardName() {
    		return cardName;
    	}
    
    	public void setCardName(String cardName) {
    		this.cardName = cardName;
    	}
    
    	public String getCardNumber() {
    		return cardNumber;
    	}
    
    	public void setCardNumber(String cardNumber) {
    		this.cardNumber = cardNumber;
    	}
    
    }

     

    展开全文
  • 主要介绍了Java Stream 流实现合并操作,结合实例形式详细分析了Java Stream 流实现合并操作原理与相关注意事项,需要的朋友可以参考下
  • 本篇文章主要介绍了java 两个数组合并的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • java 两个对象之间进行数据合并

    千次阅读 2020-05-31 23:01:00
    合并方法 /* 以第一个实体类为主,如果第一个的实体类某个字段为空,则会吧第二个实体类的值取过来进行赋值, 如果不为空的则不作改变 */ //针对所用对象 private static Object combineSydwCore(Object sourceBean,...
  • 关于反射:在Java合并两个对象

    千次阅读 2021-03-09 05:14:50
    我有两个相同类型的对象。Class A {String a;List b;int c;}A obj1 = new A();A obj2 = new A();obj1 => {a ="hello"; b = null; c = 10}obj2 => {a = null; b = new ArrayList(); c = default value}您能否让...
  • Java 对象按照多个属性来合并

    千次阅读 2021-03-09 05:15:37
    private static final String detailId="detailId";private static final String shelfBinCode=.../*** 相同商品+相同货架相同货位合并* @param* @return*/public List mergeSub(List subs){HashMap receiptNoteDeta...
  • Java合并json对象

    2021-11-23 15:02:53
    1、引入依赖 com.alibaba fastjson 1.2.78 2、合并json对象 /** * 合并JSON对象,用source覆盖target,返回覆盖后的JSON对象, * * @param source JSONObject * @param target JSONObject * @return JSONObject */ ...
  • 在常见的业务需求开发中会有这样一种场景,需要的数据集合来源有3种不同的来源,并且返回的都是List集合,现在需要做的是将这3个List集合中的对象属性合并,不是集合对象合并。 例如Store对象有四个字段,id,name,...
  • 在web开发中,经常遇到...而使用hibernate,它的修改是基于对象的,如果用户修改的字段非常多,但是我们并不知道用户到底修改了那个字段,这时候就需要一个一个的去判断,因此非常耗时,所以我写了个工具类来帮助大家!
  • 主要介绍了java 实现多个list 合并成一个去掉重复的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 主要介绍了Java实现把两个数组合并为一个的方法,结合实例形式总结分析了java常用的四种数组合并操作技巧,需要的朋友可以参考下
  • java合并json对象,对象是ECharts里的Option 如 json1 {"title": {"textStyle": {"color": "1111","decoration": "2222"}}} json2 {"title": {"textStyle": {"color": "aaaa","color2": "bbbb"}}} 想得到的结果 {...
  • 之前有个解决方案是关于beanUtil.Copy之后,还需要处理才能使两个对象合并,今天偶尔发现还有更好用的分发,所以特此share一下。这是一个BeanUtil.Merge方法,JAVA合并对象属性,把对象的非空属性合成到目标对象上。...
  • 不知道你说的是不是这个:package ...import java.util.*;public class ListMergeTest {public static void main(String[] args) {List listA = new ArrayList<>();List listB = new ArrayList<&...
  • Java对象的属性值合并

    万次阅读 2021-09-13 14:20:36
    } /** * description 合并对象(该方法是用于相同对象不同属性值的合并) * * @author yanzy * @version 1.0 * @date 2021/9/13 11:09 */ public static User mergeObject(User user1, User user2) throws ...
  • 秉承互联网的分享精神,给各位看官分享一个json对象合并的实现方法,基于阿里的fastjson。 ### 代码实现(java) ```java /** * 合并JSON对象,用source覆盖target,返回覆盖后的JSON对象。 * * @param ...
  • 主要介绍了java文件操作工具类,类实现了复制文件和文件合并的功能,需要的朋友可以参考下
  • 假设我在内存中有两个JSONObject数组,每个对象都有一个在两个数组中相似的键:数组1[{"name": "Big Melons Co.","location": "Inner City Dubai""id": "1A"},{"name": "Pear Flavored Juices Ltd","location": ...
  • 实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象合并,如果是多个 map 合并也是用这种方式。public static void main(String[] args) {...
  • 合并Java 8中的两个对象列表

    千次阅读 2021-03-17 13:09:44
    小编典典如果要实现equalsand hashCode,则 在 类 内部 进行操作Parent。在该类中添加类似的方法@Overridepublic int hashCode() {return Objects.hash(getAttrib1(), getAttrib2(), getAttrib3(),// …getAttrib19...
  • java8 两个同类的实体对象合并属性

    千次阅读 2020-12-29 15:46:35
    看到同事写的代码二三十行,全部是这种...参考文章java 复制非空对象属性值 这里主要使用到的是hutoolBean工具-BeanUtil,复制属性方法 copyProperties 看一下源码 这里是可以对某些属性不进行赋值的,比如...
  • 工作上遇到一个要求两个不同list对象合并后并排序1、问题描述从数据库中查询两张表的当天数据,并对这两张表的数据,进行合并,然后根据时间排序。2、思路从数据库中查询到的数据放到各自list中,先遍历两个list,存...
  • java8两个List指定对象属性进行合并

    千次阅读 2021-08-05 09:19:28
    public static void main(String[] args) { // 获取到一级渠道-雇员的关联关系集合 List<EmpQuDaoOneAdmin> empQuDaoOneAdmins = new ArrayList<>(); EmpQuDaoOneAdmin dEmpQuDaoOneAdmin = new ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,232
精华内容 84,092
关键字:

java对象合并

java 订阅
友情链接: f.zip