Stream流在集合中的使用demo

说实话,很久没更新博客了。主要是每天都在做需求中,可记录的时间少,可分享的内容也少了。这不把自己写的一个对stream流的使用记录一下。

package com.fanhf.javastudy.streamMap;


import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <pre>
 * @Desc   :
 * @Author : fanhf
 * @Date   :2021/9/1 23:17
 * </pre>
 */
public class StreamMain {
    public static void main(String[] args) {
        System.out.println("信息:" + JSON.toJSONString(test()));
    }


    /**
     * <pre>
     * @Desc   : 根据villageBizcirclesList里面的数据,获取到商圈在楼盘中数量排名前2的商圈的商圈名和商圈所在行政区域
     * @Author : fanhf
     * @Date   : 2021/9/2 11:14
     *
     * @Return : java.util.List<com.fanhf.javastudy.streamMap.KeeperDetailBaseInfoVo.BusinessDistrict>
     * </pre>
     */
    public static List<KeeperDetailBaseInfoVo.BusinessDistrict> test() {
        List<VillageDO> villageBizcirclesList = Arrays.asList(
                new VillageDO(1L, "a", Arrays.asList(
                        new BizCircleDO("01", "01商圈", Collections.singletonList(new DistrictDO("001", "朝阳区"))),
                        new BizCircleDO("02", "02商圈", Collections.singletonList(new DistrictDO("002", "海淀区"))))
                ),
                new VillageDO(2L, "b", Arrays.asList(
                        new BizCircleDO("02", "02商圈", Collections.singletonList(new DistrictDO("002", "海淀区"))),
                        new BizCircleDO("03", "03商圈", Collections.singletonList(new DistrictDO("003", "东城区"))),
                        new BizCircleDO("05", "05商圈", Collections.singletonList(new DistrictDO("005", "房山区"))))
                ),
                new VillageDO(3L, "c", Arrays.asList(
                        new BizCircleDO("01", "01商圈", Collections.singletonList(new DistrictDO("001", "朝阳区"))),
                        new BizCircleDO("03", "03商圈", Collections.singletonList(new DistrictDO("003", "东城区"))))
                ),
                new VillageDO(4L, "d", Arrays.asList(
                        new BizCircleDO("01", "01商圈", Collections.singletonList(new DistrictDO("001", "朝阳区"))),
                        new BizCircleDO("04", "04商圈", Collections.singletonList(new DistrictDO("004", "西城区"))))
                ),
                new VillageDO(5L, "e", Arrays.asList(
                        new BizCircleDO("05", "05商圈", Collections.singletonList(new DistrictDO("005", "房山区"))),
                        new BizCircleDO("02", "02商圈", Collections.singletonList(new DistrictDO("002", "海淀区"))),
                        new BizCircleDO("03", "03商圈", Collections.singletonList(new DistrictDO("003", "东城区"))))
                )
        );
        return getBizcircle2(villageBizcirclesList);
    }


    public static List<KeeperDetailBaseInfoVo.BusinessDistrict> getBizcircle2(List<VillageDO> villageBizcirclesList) {
        //获取商圈信息
        Map<String, List<BizCircleDO>> bizCircleVillageMap = Maps.newHashMap();

        //1、整合所有的商圈信息
        for (VillageDO villageDO : villageBizcirclesList) {
            List<BizCircleDO> bizCircleDOList = villageDO.getBizcircles();
            for (BizCircleDO bizCircleDO : bizCircleDOList) {
                List<BizCircleDO> bizCircleDOListNew = new ArrayList<>();
                if (!bizCircleVillageMap.containsKey(bizCircleDO.getBizCircleId())) {
                    bizCircleDOListNew.add(bizCircleDO);
                    bizCircleVillageMap.put(bizCircleDO.getBizCircleId(), bizCircleDOListNew);
                } else {
                    bizCircleDOListNew = bizCircleVillageMap.get(bizCircleDO.getBizCircleId());
                    bizCircleDOListNew.add(bizCircleDO);
                }
            }
        }

        //2、获取商圈数量最多的排名前2的商圈集合
        List<Map.Entry<String, List<BizCircleDO>>> bizcircleMap = bizCircleVillageMap.entrySet()
                .stream()
                .sorted(Comparator.comparing(stringListEntry -> -stringListEntry.getValue().size()))
                .limit(2)
                .collect(Collectors.toList());

        //3、从排名前2的商圈集合中获取需要的行政区和商圈的对应信息
        return bizcircleMap.stream()
                .map(stringListEntry -> stringListEntry.getValue().get(0))
                .map(bizCircleDO -> KeeperDetailBaseInfoVo.BusinessDistrict.builder()
                        .id(bizCircleDO.getBizCircleId())
                        .name(bizCircleDO.getBizCircleName())
                        .region(bizCircleDO.getDistricts()
                                .stream()
                                .map(DistrictDO::getDistrictName)
                                .collect(Collectors.toList()))
                        .build())
                .collect(Collectors.toList());
    }


    //另解,这种方法确实很简洁,但是估计过一阵子就不知道啥意思了,不过这段代码不是我写的,是大神写的,也算是一种学习,我上面的方法是根据这个拆出来的,可读性应该比下面好很多
    public static List<KeeperDetailBaseInfoVo.BusinessDistrict> getBizcircle1(List<VillageDO> villageBizcirclesList) {
        return villageBizcirclesList.stream()
                //获取到集合对象中的Bizcircles并存到List
                .map(VillageDO::getBizcircles)
                //将多个List流并为一个对象流
                .flatMap(Collection::stream)
                //将流中对象按照商圈Id进行分组后,把BizCircleId作为key,BizCircleDO放到List后作为value,放入Map
                .collect(Collectors.groupingBy(BizCircleDO::getBizCircleId))
                //调用Map.entrySet方法进行遍历
                .entrySet()
                //将Set<Map.Entry<K, V>>转为流Stream<<Map.Entry<K, V>>>
                .stream()
                //按照商圈集合的数量进行倒排,就变成了Stream<BizCircleDO>
                .sorted(Comparator.comparing(entry -> -entry.getValue().size()))
                .limit(2)
                // 倒排后取前2个后,获取List中第1/2个商圈的对象信息,entry.getValue() = List<BizCircleDO>
                .map(entry -> entry.getValue().get(0))
                // 获取流中BizCircleDO的属性信息
                .map(data ->
                        KeeperDetailBaseInfoVo.BusinessDistrict.builder()
                                .id(data.getBizCircleId())
                                .name(data.getBizCircleName())
                                .region(data.getDistricts().stream()
                                        .map(DistrictDO::getDistrictName)
                                        .collect(Collectors.toList()))
                                .build())
                .collect(Collectors.toList());
    }
}

下面就是一些类了
BizCircleDO

package com.fanhf.javastudy.streamMap;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * <pre>
 * @Desc   :
 * @Author : fanhf
 * @Date   :2021/9/1 23:16
 * </pre>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BizCircleDO {
    private String bizCircleId;
    private String bizCircleName;
    private List<DistrictDO> districts;
}

DistrictDO

package com.fanhf.javastudy.streamMap;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * <pre>
 * @Desc   :
 * @Author : fanhf
 * @Date   :2021/9/2 10:37
 * </pre>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DistrictDO {
    private String districtId;
    private String districtName;
}

KeeperDetailBaseInfoVo

package com.fanhf.javastudy.streamMap;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * <pre>
 * @Desc   :
 * @Author : fanhf
 * @Date   :2021/9/2 10:36
 * </pre>
 */
public class KeeperDetailBaseInfoVo {
    private List<BusinessDistrict> businessDistrict;
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class BusinessDistrict {
        private String name;
        private String id;
        private List<String> region;
    }
}       

VillageDO

package com.fanhf.javastudy.streamMap;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * <pre>
 * @Desc   :
 * @Author : fanhf
 * @Date   :2021/9/1 23:25
 * </pre>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VillageDO {
    private Long villageId;
    private String villageName;
    private List<BizCircleDO> bizcircles;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值