前提
@Data
@TableName(value ="psb_user_exchange_record")
public class PsbExchangeRecord implements Serializable {
@ApiModelProperty(value = "id")
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("用户手机号")
private String phone;
@ApiModelProperty("奖品id")
private Integer prizeId;
@ApiModelProperty("奖品券号")
private String marketCfgId;
@ApiModelProperty("奖品类型 1: 实物 2:流量")
private String prizeType;
@ApiModelProperty("奖品名称")
private String prizeName;
@ApiModelProperty(value = "创建时间")
@TableField("create_time")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@TableField("update_time")
private Date updateTime;
@ApiModelProperty("商户请求流水(如果要检查券是否发送成功需要该参数)")
private String merchantOrderSeq;
@ApiModelProperty("发放的奖券(电信发放)")
private String grantPrizeTicket;
@ApiModelProperty("发放状态信息(电信发放)")
private String grantStatus;
@ApiModelProperty("发放奖券时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime grantPrizeTime;
@ApiModelProperty("查询发券状态接口返回")
private String grantStatusQuery;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
// 获取该用户已经获得的奖品
List<PsbExchangeRecord> userRecord = psbUserExchangeRecordService.list(Wrappers.<PsbExchangeRecord>lambdaQuery()
.eq(PsbExchangeRecord::getPhone, userPhone)
.eq(PsbExchangeRecord::getGrantStatus,"000000"));
将list 过滤, 只得到流量奖品名称list集合。
只得到list集合中的某一个字段 如流量的奖品名称。
这是过滤了两次。
filter()的用法 获得与之相等的数据,其它不符合的数据不要
List<String> userPrizeName = userRecord.stream().filter(x -> "2".equals(x.getPrizeType()))
.map(PsbExchangeRecord::getPrizeName).collect(Collectors.toList());
List<PsbPrizeStock> collect = stocks.stream().filter(p -> "2".equals(p.getPrizeType()))
.collect(Collectors.toList());
取不是userPrizeName的collect集合,也就是将collect集合中的符合userPrizeName的去除。
通过stream流过滤两个list集合 ,取某一个的差集。
List<PsbPrizeStock> fakePrize = collect.stream().filter(p -> !userPrizeName.contains(p.getName()))
.collect(Collectors.toList());
总结:
list集合使用stream流过滤数据。
如果只想获得list集合中的某一个字段 用list.stream(). map(字段名) 。
实例:list.stream().map(PsbExchangeRecord::getPrizeName) 只拿到prizeName 字段
是一个List集合。
如果想获得某一个字段并且符合某个条件 如是男生,年龄大于多少 或者小于多少 就用filter
list.filter(x->条件.equals(x.get条件)).map(字段)。
实例:
userRecord.stream().filter(x->“2”.equals(x.getPrizeType())).
map(PsbExchangeRecord::getPrizeName).collect(Collectors.toList());
之所以要写这个笔记 就是因为卡在了 如何用一个list集合过滤另一个list集合。更准确点是用一个list集合中的某一个字段过滤另一个list 集合。