天天看点

阿里百度华为消息队列MQ异步场景面试题(下)3 java8

3 java8

业务需求里需要按某几个字段去重(acctId,billingCycleId,prodInstId,offerId)

我这里想到了遍历集合areaDatas 后用contains方法判断 重写AcctItemYzfBean实体类的equals方法实现,

请问有没有更好的方法? 代码如下

List<AcctItemYzfBean> newList = new CopyOnWriteArrayList<>();
//循环过滤、增强翼支付数据
Optional.ofNullable(areaDatas)//集合判空
.orElse(new ArrayList<>())
.stream()//转化为流 便于下面过滤和增强数据
.filter(Objects::nonNull)//元素判空
.filter(yzfBean -> this.judgeIfOfferId(yzfBean))//判断销售品ID是否相同
.filter(yzfBean -> this.enhanceYzfBean(yzfBean))//增强过滤accNbr和acctId
.filter(yzfBean -> this.judgeIfArrears(yzfBean))//判断是否不欠费
.filter(yzfBean -> this.judgeIfCancel(yzfBean))//判断是否销账金额大于0
.filter(yzfBean -> this.judgeIfReturn(yzfBean))//判断是否上月未返还
.forEach(yzfBean -> {
//去重 重写AcctItemYzfBean.equals方法
if(!newList.contains(yzfBean)) {
//增强latnName
yzfBean.setLatnName(commonRegionMap.get(yzfBean.getRegionId()));
//增强areaCode
yzfBean.setAreaCode(areaCode);
//数据封装
newList.add(yzfBean);
}
});

重写的equals方法
@Override
public boolean equals(Object yzfBeanObj) {
if(yzfBeanObj instanceof AcctItemYzfBean) {
AcctItemYzfBean yzfBean = (AcctItemYzfBean) yzfBeanObj;
if(Tools.isEmpty(yzfBean.getAcctId(), yzfBean.getBillingCycleId(), yzfBean.getProdInstId(), yzfBean.getOfferId())) {
return false;
}
if(yzfBean.getAcctId().equals(this.acctId) && yzfBean.getBillingCycleId().equals(this.billingCycleId)
&& yzfBean.getProdInstId().equals(this.prodInstId) && yzfBean.getOfferId().equals(this.offerId)) {
return true;
}
}
return super.equals(yzfBeanObj);
}      

解:

比如下面的类,id1和id2重复认为是重复的,id3不需要考虑

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
static class Test {
private String id1;
private String id2;
@EqualsAndHashCode.Exclude
private String id3;
}      

通过Set去重或者通过distinct去重即可:

List<Test> list = new ArrayList<>();
list.add(new Test("a","b","c"));
list.add(new Test("a","b","d"));
System.out.println(list.stream().collect(Collectors.toSet()));
System.out.println(list.stream().distinct().collect(Collectors.toList()));