经常要对集合中的数据进行过滤,我目前常用的方法有两种:
最简化问题,假设问题 list 是学生的id集合,要过滤掉id为1的学生
List<String> studentIds= new ArrayList<>();
studentIds.add("1");
studentIds.add("2");
studentIds.add("3");
1 .使用迭代器删除方法
System.out.println(studentIds); //[1, 2, 3]
studentIds.removeIf(id-> "1".equals(id));
System.out.println(studentIds); //[2, 3]
特点
- 边遍历变删除,必须用迭代器删除,会改变原集合
2 .使用stream的filter方式
List<String> CheckList = studentIds.stream().filter(id-> !"1".equals(id)).collect(Collectors.toList());
System.out.println(CheckList ); //[2, 3]
特点
- 更灵活,不会改变原集合数据
- 注意:符合条件的被留下而不是被删除
实战记录
一:宝箱中奖励的过滤
public class NewSysReward {
@ApiModelProperty("宝箱id")
private Integer boxId;
@ApiModelProperty("活动id")
private Integer activityId;
@ApiModelProperty("奖励类型")
private String rewardType;
@ApiModelProperty("奖励的奖品id,跟类型配合使用")
private Integer rewardId;
@ApiModelProperty("权重")
private Integer percentage;
@ApiModelProperty("奖励的上限数量")
private Integer rewardNum;
@ApiModelProperty("奖励id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
}
//校验奖励如果(删除,过期,下架):false;正常:true
public boolean getPrizeValid(String prizeType, Serializable id) {
if(删除,过期,下架){
return false;
}
return true;
}
- 方法一,迭代器删除
//奖励集合
List<NewSysReward> newSysRewards = newSysRewardMapper.selectList(queryWrapper);
//删除状态不正常的奖励以及上限数量为零的奖励
newSysRewards.removeIf(reward -> !this.getPrizeValid(reward.getRewardType(),reward.getRewardId()) || reward.getRewardNum().equals(0));
- 方法二,stream().filter()
//奖励集合
List<NewSysReward> newSysRewards = newSysRewardMapper.selectList(queryWrapper);
//删除状态不正常的奖励以及上限数量为零的奖励
List<NewSysReward> rewards = new ArrayList<>();
//删除奖励中过期或删除或禁用或上架数为0
for (NewSysReward newSysReward : newSysRewards) {
if (!this.getPrizeValid(newSysReward.getRewardType(),newSysReward.getRewardId())){
//删除该奖励策略中 奖励数量为0的奖励
rewards = newSysRewards.stream().filter(reward -> !reward.getRewardNum().equals(0) && !reward.getRewardId().equals(newSysReward.getRewardId())).collect(Collectors.toList());
}
}
//宝箱中无正常的奖励
if (rewards.size() == 0){
throw new BusinessException("非常抱歉,奖励被人抢走了,下次早点哦");
}
- 方法2 简写
List<NewSysReward> rewards = newSysRewards.stream().filter(reward -> !reward.getRewardNum().equals(0) && this.getPrizeValid(reward.getRewardType(), reward.getRewardId())).collect(Collectors.toList());
//宝箱中无正常的奖励
if (rewards.size() == 0){
throw new BusinessException("非常抱歉,奖励被人抢走了,下次早点哦");
}