开发中常见的Stream流用法
1.收集特定的字段信息
场景1:需要获取所有的合同名称
private List<String> loadContractNames() {
// 获取到ContractInfo集合然后进行处理
List<ContractSelectVo> contractSelectVoList = contractInfoService.getNames();
return contractSelectVoList.stream()
// 需要获取的字段
.map(ContractSelectVo::getContractName)
// 必要的时候可以用.distinct() 去重
.toList();
}
场景2:收集id集合
// 将id收集放入新的集合
List<String> ids =agreementInfoDtoList.stream()
.map(AgreementInfoDto::getId)
.collect(Collectors.toList());
2.排序
场景:需要排序的场景有很多 希望最新操作的排在最前面 有时候就会用上 .reversed()
说明:也可以在查询的时候直接进行排序
List<PointInfo> sortedRecords = records.stream()
// 默认升序排序(从小到大)
.sorted(Comparator.comparing(PointInfo::getOperationtime))
// 如果需要降序排序,可以链式调用 reversed() 方法
//.sorted(Comparator.comparing(PointInfo::getOperationtime).reversed())
.collect(Collectors.toList());
// 添加按操作时间时间降序排序
lqw.orderByDesc(PointInfo::getOperationtime);
3.filter里面判空处理
说明:满足 item.getCheckRating() != null 不为空则会被收集起来
防止空指针异常
List<EvaluationInfoVo> filteredRecords = result.getRecords().stream()
.filter(item -> item.getCheckRating() != null)
.collect(Collectors.toList());
4.下拉框返回格式处理
说明:检索条件的时候是以下拉框的形式提供给用户选择,当时与我们前端联调的时候希望返回如下数据格式 (对象中只保留value属性)
@Override
public List<StationSelectVo> getStationList() {
List<DeviceInfoVo> list = this.queryList(new DeviceInfoBo());
List<String> values = list.stream().map(DeviceInfoVo::getStation).distinct().toList();
return values.stream().map(StationSelectVo::new).toList();
}
// 也可也用 @AllArgsConstructor 注解: 生成一个包含所有字段的构造函数。
@Data
public class StationSelectVo {
private String value;
public StationSelectVo() {}
// 全参构造函数
public StationSelectVo(String value) {
this.value = value;
}
}
@Data 注解不会自动生成含参的构造函数
@AllArgsConstructor: 生成一个包含所有字段的构造函数。