list<对象> 的过滤

经常要对集合中的数据进行过滤,我目前常用的方法有两种:

最简化问题,假设问题 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("非常抱歉,奖励被人抢走了,下次早点哦");
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值