HashMap<T,T>用法用例

本文介绍了一种发货确认与开票数量对比的方法。通过查询数据库获取发货单与确认单上的商品数量,并与已开票数量进行比对,确保本次确认的数量不超过未开票数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="font-size:14px;">public HashMap<String, BigDecimal> compareQuantity(String gdk006,String gdk001) throws BusinessException{
		//得到发货gd003上的数量
		String gd003Sql="SELECT T1.* FROM gd003 T1 WHERE T1.GDK001='"+gdk001+"'";
		RowsetXML gd003RowsetXML = QueryHelper.executeQuery("", gd003Sql);
		//发货确认商品列表
		<span style="color:#ff0000;">HashMap<String, BigDecimal> mapGd003 = new HashMap<String, BigDecimal>();//  发货确认商品列表</span>
		while (gd003RowsetXML.next()) {
			Gd003 gd003 = new Gd003();
			gd003RowsetXML.writeToBean(gd003, false);
			<span style="color:#ff0000;">mapGd003.put(gd003.getGdk003(), gd003.getGdn001());</span>
		}
		//得到本次确认的gdk006的商品明细(T2.ACK001,T2.GDN015)
		//String gd008Sql="SELECT T2.GDK003,SUM(T2.Gdn015) GDN015 FROM gd006 T1,GD008 T2 WHERE T1.GDK006=T2.Gdk006 AND T1.GDK006='"+gdk006+"' GROUP BY T2.GDK003";
		String gd008Sql ="SELECT T2.GDK003,SUM(T2.Gdn015) GDN015 FROM GD008 T2 WHERE T2.GDK006='"+gdk006+"' GROUP BY T2.GDK003";
		RowsetXML gd008RowsetXML = QueryHelper.executeQuery("", gd008Sql);
		//发货确认商品列表
		HashMap<String, BigDecimal> mapGd008 = new HashMap<String, BigDecimal>();//  发货确认商品列表
		//HashMap<String, BigDecimal> retMapGd008 = new HashMap<String, BigDecimal>();//  发货确认商品列表返回值
		while (gd008RowsetXML.next()) {
			
			mapGd008.put(gd008RowsetXML.getString("GDK003"),gd008RowsetXML.getBigDecimal("GDN015"));
			//retMapGd008.put(gd008RowsetXML.getString("GDK003"), gd008RowsetXML.getBigDecimal("GDN015"));
		}
		
		//得到gdk003对应的已开票数量
		String ge002Sql1="SELECT T3.GDK003,SUM(T3.Gbn007) GBN007 FROM ge002 T3 WHERE T3.GDK003 IN(SELECT T2.GDK003 FROM  GD003 T2 WHERE T2.GDK001 = '"+gdk001+"') GROUP BY T3.GDK003";
		RowsetXML ge002RowsetXML = QueryHelper.executeQuery("", ge002Sql1);
		//发货确认商品列表对应的开票
		HashMap<String, BigDecimal> mapGe002 = new HashMap<String, BigDecimal>();//  开票商品列表
		while (ge002RowsetXML.next()) {
			mapGe002.put(ge002RowsetXML.getString("GDK003"),ge002RowsetXML.getBigDecimal("GBN007"));
		}
		
		<span style="color:#ff0000;">//比较是否有本次确认数量大于未开票数量  有就返回false
		Iterator<String> iterator = mapGd003.keySet().iterator();
		while (iterator.hasNext()) {// 主键为空的,直接新增;主键不为空,覆盖原来的数据后更新。
			String goodsId = iterator.next();
			boolean flag=mapGe002.get(goodsId)!=null&&mapGd008.get(goodsId)!=null&&mapGd003.get(goodsId).subtract(mapGe002.get(goodsId)).compareTo(mapGd008.get(goodsId))<0;
			if(flag){//开票表和确认表都有该商品且本次确认数量大于未开票数量
				mapGd008.put("flag", BigDecimal.ZERO);
				return mapGd008;
			}
		}</span>
		mapGd008.put("flag", BigDecimal.ONE);
		return mapGd008;</span>

好的,假设现在的VoConstructor已经被优化成为上述四种方式的一种,请回过头来继续优化第一个问题中的处理集合的方法,即processListData(……)方法。以防你无法获取第一个问题中方法的代码,我将其源码粘贴到这个问题的最下方供你研究: /** * 分组处理列表数据 * * @param list 待处理列表 * @param keyExtractor 分组键提取器 * @param nameExtractor 名称提取器 * @param defectNumberExtractor 数量提取器 * @param voConstructor 对象构造器 * @param <T> 输入列表的元素类型 * @param <K> 分组键类型 * @param <V> 返回对象类型 * @return 返回对象集合 */ public static <T, K, V> List<V> processListData( List<T> list, Function<T, K> keyExtractor, Function<T, String> nameExtractor, ToLongFunction<T> defectNumberExtractor, VoConstructor<K, V> voConstructor) { // 非空处理 if (HussarUtils.isEmpty(list) || HussarUtils.isEmpty(keyExtractor) || HussarUtils.isEmpty(nameExtractor) || HussarUtils.isEmpty(defectNumberExtractor) || HussarUtils.isEmpty(voConstructor)) { return Collections.emptyList(); } // 分组并构造返回对象集合 return list.stream() .filter(item -> HussarUtils.isNotEmpty(keyExtractor.apply(item))) // 确保分组键不为空 .collect(Collectors.groupingBy(keyExtractor)) .entrySet().stream() .map(entry -> { K key = entry.getKey(); long defectSum = entry.getValue().stream() .mapToLong(item -> { long defectNumber = defectNumberExtractor.applyAsLong(item); return defectNumber < 0 ? 0 : defectNumber; // 处理 null 或负值的情况 }) .sum(); // 提取第一个非空的名称作为分组名称 String name = entry.getValue().stream() .map(nameExtractor) .filter(HussarUtils::isNotEmpty) .findFirst() .orElse(null); return voConstructor.construct(key, name, defectSum); }) .collect(Collectors.toList()); }
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值