Map<String,List<Bean>>不能说的秘密

本文详细介绍了一种在Java中实现Map深拷贝的方法,特别关注了如何处理Map中包含的List对象。通过实例演示了如何使用反射机制来拷贝Map中的对象值,确保源Map和目标Map完全独立。

MapValueCloneTest.java

package org.apache.java.test;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.java.entity.EmployInfo;
import org.apache.java.entity.PassInfo;

public class MapValueCloneTest {

    public static void main(String[] args) throws Exception{
        HashMap<String, List<EmployInfo>> employInfo = new HashMap<String, List<EmployInfo>>();

        List<EmployInfo> employList = new ArrayList<EmployInfo>();
        employList.add(new EmployInfo("libo", "18767136865"));
        employList.add(new EmployInfo("liba", "18767136864"));
        employList.add(new EmployInfo("liaa", "18767136863"));
        
        employInfo.put("1", employList);
        employInfo.put("2", employList);
        

        PassInfo[] sre = new PassInfo[3];
        for(int i = 0; i < sre.length; i++){
            sre[i] = new PassInfo();
        }
        Map<String,List<Object>> passInfo = mapInfoToOtherMap(employInfo,sre);
        Iterator<Entry<String, List<Object>>> pasInfo = passInfo.entrySet().iterator();
        while (pasInfo.hasNext()) {
            List<Object> lpInfo = pasInfo.next().getValue();
            for (Object tempPass : lpInfo) {
                System.out.println("员工姓名:" + ((PassInfo) tempPass).getEmployName());
                System.out.println("员工号码:" + ((PassInfo) tempPass).getEmployNumber());
            }
        }
    }

    /**
     * Map之间的值拷贝
     * 
     * @Description: Map中包含List对象,List泛型,实现两个Map之间的值拷贝
     * @param srcInfo
     *        源Map
     * @param objEntity
     *        生成对象实例数组
     * @return 生成后的Map对象
     * @throws Exception     
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Map<String, List<Object>> mapInfoToOtherMap(
                    HashMap srcInfo, Object... objEntity)
                    throws Exception {

        // 返回对象的实例化
        Map<String,List<Object>> returnInfo = new HashMap<String,List<Object>>();
        
        // 获得迭代对象
        Iterator<?> iterInfo = srcInfo.entrySet().iterator();
        // 开始迭代
        while (iterInfo.hasNext()) {

            // 返回对象的List集合
            List obj = new ArrayList<Object>();

            // 获取Map中的键值对
            Entry<String, List<Object>> entryInfo = (Entry<String, List<Object>>) iterInfo.next();
            String key = entryInfo.getKey();
            List<Object> insInfo = entryInfo.getValue();
            
            // 对List对象进行迭代
            Iterator<Object> objInfo = insInfo.iterator();
            
            // 临时变量,用户获取生成的对象实例
            int k = 0;
            // 开始迭代
            while (objInfo.hasNext()) {
                
                // 获得List中的Bean对象,通过反射拿到属性
                Object srcObj = objInfo.next();
                Field[] srcFiled = srcObj.getClass().getDeclaredFields();

                // 获取生成的对象实例,通过反射拿到属性
                Object dirObj = objEntity[k];
                Field[] dirFiled = dirObj.getClass().getDeclaredFields();

                for (int i = 0; i < srcFiled.length; i++) {
                    // 拿到属性值,进行拷贝
                    srcFiled[i].setAccessible(true);
                    Object srcValueObj = srcFiled[i].get(srcObj);
                    
                    dirFiled[i].setAccessible(true);
                    dirFiled[i].set(dirObj, srcValueObj);
                }
                
                // 放入List集合
                obj.add(dirObj);
                
                k++;
            }
            
            // 放入Map集合
            returnInfo.put(key, obj);
        }
        return returnInfo;
    }
}

EmployInfo.java

package org.apache.java.entity;

/**
 * 员工信息类
 * 
 * @ClassName: EmployInfo
 * @Description: 员工信息类
 * @author tyu_libo
 * @date 2014年12月20日 下午6:52:58
 * 
 */
public class EmployInfo{

    /**
     * 员工姓名
     */
    private String employName;

    /**
     * 员工号码
     */
    private String employNumber;

    /**
     * @return the employName
     */
    public String getEmployName() {
        return employName;
    }

    /**
     * @param employName
     *            the employName to set
     */
    public void setEmployName(String employName) {
        this.employName = employName;
    }

    /**
     * @return the employNumber
     */
    public String getEmployNumber() {
        return employNumber;
    }

    /**
     * @param employNumber
     *            the employNumber to set
     */
    public void setEmployNumber(String employNumber) {
        this.employNumber = employNumber;
    }

    /**
     * 
     * @Description:
     * @param employName
     * @param employNumber      
     * @throws
     */
    public EmployInfo(String employName,
                    String employNumber) {
        this.employName = employName;
        this.employNumber = employNumber;
    }

}

UserInfo.java

package org.apache.java.entity;

import java.io.Serializable;

/**
 * 用户信息Entity
 * 
 * @author Administrator
 *
 */
public class UserInfo implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7947100192425556667L;
	private String userName;
	private String className;
	private String telNmuber;
	private String ipAddress;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}
	public String getTelNmuber() {
		return telNmuber;
	}
	public void setTelNmuber(String telNmuber) {
		this.telNmuber = telNmuber;
	}
	public String getIpAddress() {
		return ipAddress;
	}
	public void setIpAddress(String ipAddress) {
		this.ipAddress = ipAddress;
	}
	
	public UserInfo(){}
	public UserInfo(String userName, String className, String telNmuber,
			String ipAddress) {
		super();
		this.userName = userName;
		this.className = className;
		this.telNmuber = telNmuber;
		this.ipAddress = ipAddress;
	}
	
}


转载于:https://my.oschina.net/u/1858909/blog/358851

### Java Map<String, List<Bean>> 的多字段分组实现 在Java中,可以利用`Stream API`来简化复杂的数据处理逻辑。对于基于多个字段对 `Map<String, List<Bean>>` 进行分组的需求,可以通过组合使用`Collectors.groupingBy()` 和其他流操作符完成。 #### 基于多个字段的分组方法 为了按照多个属性对对象列表进行分类,通常会创建一个新的键值作为分组依据,该键由这些选定字段组成的一个复合键表示。下面是一个具体的例子明如何通过两个或更多字段来进行分组: ```java import java.util.*; import java.util.stream.Collectors; class Bean { private final String fieldA; private final int fieldB; public Bean(String a, int b){ this.fieldA = a; this.fieldB = b; } // Getters and setters omitted for brevity @Override public String toString(){ return "Bean{" + "fieldA='" + fieldA + '\'' + ", fieldB=" + fieldB + '}'; } } public class MultiFieldGroupExample { static class CompositeKey { private final String keyPartOne; private final Integer keyPartTwo; public CompositeKey(String partOne, Integer partTwo) { this.keyPartOne = partOne; this.keyPartTwo = partTwo; } @Override public boolean equals(Object o) { ... } // Implement equality check based on both parts @Override public int hashCode() { ... } // Provide hash code implementation using both fields @Override public String toString(){...} // For debugging purposes } public static void main(String[] args) { List<Bean> beans = Arrays.asList( new Bean("a", 1), new Bean("b", 2), new Bean("a", 1), new Bean("c", 3)); Map<CompositeKey, List<Bean>> groupedBeans = beans.stream() .collect(Collectors.groupingBy(bean -> new CompositeKey(bean.getFieldA(), bean.getFieldB()))); System.out.println(groupedBeans); } } ``` 上述代码展示了怎样定义一个包含所需分组条件的对象(这里是`CompositeKey`),并将其用于`groupingBy`函数内[^4]。 此方案允许灵活地指定任意数量的分组标准,并能有效地管理具有相同特征的不同实例之间的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值