Java Stream

java集合使用stream流处理数据记录

1.stream中使用map,filter

//.map之后还是流,可以转单个元素,也能转成类
List<String> msisdns = detailsVOList
    .stream()
    .filter(vo->vo.getStatus().equalsIgnoreCase("0"))
    .map(CardInfoDetailsVO::getMsisdn).collect(Collectors.toList());

//转成另一个类,不推荐,会不断新建对象
List<XhCardSettingRecord> xhCardSettingRecords = settingRecordList
    .stream()
    .map(v->{return new XhCardSettingRecord(v.getId(),v.getOperateStatus(),v.getBatchNumber(),v.getJobId());})
    .collect(Collectors.toList());

//.filter获取符合条件的流
List<String> msisdns = detailsVOList
    .stream()
    .filter(vo->vo.getStatus().equalsIgnoreCase("0"))
    .map(CardInfoDetailsVO::getMsisdn)
    .collect(Collectors.toList());

2.使用Collectors对集合进行互转

//list转map,Collectors.toMap,function.identity是转实体,
Map<String, GenTableColumn> tableColumnMap = tableColumns
    .stream()
    .collect(Collectors.toMap(GenTableColumn::getColumnName,Function.identity()));
//有重复key,可以在第三个参数使用(oldV,newV)->oldV来进行覆盖操作
//有重复key会转map错误
Map<String,String> iccIdMap = xhCards
    .stream()
    .collect(Collectors
    .toMap(k->XingHanUtils.computeIccid(k.getIccid()),XhCard::getIccid,(oldV,newV)->oldV));

//list转set
Set<String> groupId = groupSmartVoiceVO
    .getGroupVoiceInfoList()
    .stream()
    .map(GroupSmartVoiceVO.GroupVoiceInfo::getGroupId)
    .collect(Collectors.toSet());

//收集为list
List<String> msisdns = detailsVOList
    .stream()
    .filter(vo->vo.getStatus().equalsIgnoreCase("0"))
    .map(CardInfoDetailsVO::getMsisdn).collect(Collectors.toList());

3.使用groupingby进行分组

//按照一个其中一个元素进行分组
Map<String,List<XhFlowRecord>>  maps= flowList
    .stream()
    .collect(Collectors.groupingBy(XhFlowRecord::getMsisdn));

//分组后,可以再用Collectors.mapping进行转list操作
Map<String, List<List<GroupMemberInfoVO.GroupMemberInfoListDTO>>> groupMemberMap =
    allMemberInfoList
    .parallelStream()
    .collect(
    Collectors
    .groupingBy(MemberInfoDTO::getGroupId, Collectors.mapping(MemberInfoDTO::getMemberinfoList, Collectors.toList())));


//分组后,可以再用Collectors.groupingby再次进行分组
Map<String,Map<Integer,Long>> batchNumberStatusNumMap = xhCardSettingRecords
    .stream()
    .filter(k-> StringUtils.isNotBlank(k.getBatchNumber()))
    .collect(Collectors
    .groupingBy(XhCardSettingRecord::getBatchNumber
    , Collectors.groupingBy(XhCardSettingRecord::getOperateStatus,Collectors.counting())));

4.使用flatMap对List<T>中包含list类的集合进行操作

@Data
public class BatchChangeCardStatusResultDTO implements Serializable {

    private String message;
    private String stauts;
    private List<BatchChangeCardStatusResult> resultList;

    @Data
    public static class BatchChangeCardStatusResult implements Serializable{

        private String msisdn;

        private String jobId;
    }
}

//flatMap获取到的是stream,
//例子是Stream<BatchChangeCardStatusResultDTO.BatchChangeCardStatusResult>
//转成流之后能之前那样在进行操作,这次只进行收集操作
List<BatchChangeCardStatusResultDTO.BatchChangeCardStatusResult> jobIdList = results
    .stream()
    .filter(k->k.getStauts().equalsIgnoreCase(BaseOneLinksVO.SUCCESS))
    .flatMap(result->result.getResultList().stream())
    .collect(Collectors.toList());

版权声明:本文为kangkanghjk原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。