说实话,很久没更新博客了。主要是每天都在做需求中,可记录的时间少,可分享的内容也少了。这不把自己写的一个对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;
}