Java Stream流实现List中正负抵消&保留有效

文章目录

一、背景

最近有个需求是要从外系统接收的发票数据的结果集List,过滤出有效数据。对方未给每条数据打标,允许多次开票,只想保留未被冲红的订单。记录筛选过程,方便备查。

二、实现思路

第一步、遍历出所有有效蓝票,即invType为蓝票-1,status为成功-1

第二步、用有效蓝票list匹配所有,匹配上则移除

第三步、全量List信息遍历打标,是否有效isEffect

三、代码实现

1、构造测试数据

java 复制代码
// 测试数据
String str = "[\r\n" + 
				"		{\r\n" + 
				"			\"serialNo\": \"100001\",\r\n" + 
				"			\"invNo\": \"200001\",\r\n" + 
				"			\"businessDate\": \"2024-05-01\",\r\n" + 
				"			\"isEffect\": \"\",\r\n" + 
				"			\"invType\": \"1\",\r\n" + 
				"			\"status\": \"1\",\r\n" + 
				"			\"originalInvNo\": \"\"\r\n" + 
				"		},\r\n" + 
				"		{\r\n" + 
				"			\"serialNo\": \"100002\",\r\n" + 
				"			\"invNo\": \"200002\",\r\n" + 
				"			\"businessDate\": \"2024-05-02\",\r\n" + 
				"			\"isEffect\": \"\",\r\n" + 
				"			\"invType\": \"0\",\r\n" + 
				"			\"status\": \"1\",\r\n" + 
				"			\"originalInvNo\": \"200001\"\r\n" + 
				"		},\r\n" + 
				"		{\r\n" + 
				"			\"serialNo\": \"100003\",\r\n" + 
				"			\"invNo\": \"200003\",\r\n" + 
				"			\"businessDate\": \"2024-05-01\",\r\n" + 
				"			\"isEffect\": \"\",\r\n" + 
				"			\"invType\": \"1\",\r\n" + 
				"			\"status\": \"1\",\r\n" + 
				"			\"originalInvNo\": \"\"\r\n" + 
				"		}\r\n" + 
				"	]\r\n" ;
List<InvInfoDto> allInvList = JsonUtils.parseArray(str, InvInfoDto.class);
logger.info("------> 原始所有发票allInvList为:"	+ JsonUtils.parseObject(allInvList));

发票数据结果InvInfoDto 如下

java 复制代码
@Data
public class InvInfoDto {
/**
 * 序列号
 */
private String serialNo;
/**
 * 单号
 */
private String invNo;
/**
 * 日期
 */
private String businessDate;
/**
 * 类型:1-蓝票,0-红票
 */
private String invType;
/**
 * 是否有效:1-有效
 */
private String isEffect;
/**
 * 状态:1-成功
 */
private String status;
/**
 * 原始单号
 */
private String originalInvNo;
}

2、获取有效list

遍历所有list,取出所有为蓝票,即有效票,组装成 effectInvList

java 复制代码
// 第一步、遍历出所有有效蓝票,即invType为蓝票-1,status为成功-1
List<InvInfoDto> effectInvList = allInvList.stream()
			.filter(inv -> "1".equals(inv.getInvType()))
			.collect(Collectors.toList());
logger.info("------> 有效蓝票effectInvList:" + JsonUtils.parseObject(effectInvList));

遍历结果如下图所示。

3、去除重复并保留有效list

从有效蓝票list中过滤所有发票集合中,InvNo和OriginalInvNo相等的记录,使用 noneMatch 来匹配。

java 复制代码
// 第二步、用有效蓝票list匹配所有,匹配上则移除
List<InvInfoDto> resultInvList = effectInvList.stream()
		.filter(e -> allInvList.stream()
		.noneMatch(inv -> e.getInvNo().equals(inv.getOriginalInvNo() &&"1".equals(inv.getStatus())))
		.collect(Collectors.toList());
logger.info("------> 过滤出有效resultInvList为:" + JsonUtils.parseObject(resultInvList));

过滤完的结果如下。

4、结果打标

数据打标,即遍历数据,对在有效list中的数据is_effect赋值为1,其他赋值为0。

java 复制代码
// 第三步、全量List信息遍历打标,是否有效isEffect
List<InvInfoDto> finallyInvList = allInvList.stream()
			.filter(all -> resultInvList.stream().anyMatch(inv -> {
					if (all.getInvNo().equals(inv.getInvNo())
							&& "1".equals(inv.getStatus())) {
						all.setIsEffect("1");
					} else {
						all.setIsEffect("0");
					}
					return true;
			})).collect(Collectors.toList());
logger.info("------> 所有结果finallyInvList为:" + JsonUtils.parseObject(finallyInvList));

数据打标结果如下图所示。

参考资料

【1】https://blog.csdn.net/k8080880/article/details/134153041

相关推荐
一二小选手1 分钟前
【Java Web】分页查询
java·开发语言
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ13 分钟前
idea 弹窗 delete remote branch origin/develop-deploy
java·elasticsearch·intellij-idea
Code成立16 分钟前
《Java核心技术 卷I》用户图形界面鼠标事件
java·开发语言·计算机外设
鸽鸽程序猿40 分钟前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法
遇见你真好。1 小时前
自定义注解进行数据脱敏
java·springboot
NMBG221 小时前
[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
java·开发语言·面试·java-ee·intellij-idea
像污秽一样1 小时前
Spring MVC初探
java·spring·mvc
计算机-秋大田1 小时前
基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
LuckyLay1 小时前
Spring学习笔记_36——@RequestMapping
java·spring boot·笔记·spring·mapping
醉颜凉2 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法