大數據量模糊查詢優化(流去重,流分批,建樹操作)
- 前言
- 一、java8 流是什么
- 二、本次優化涉及操作
- 1.流去重
- 2.流分批
- 3.hutool樹工具類建樹
- 4.全部代碼
- 總結
前言
有時候會進行大數據量查詢后的建樹操作,如果直接使用sql語句會大大延緩業務效率,因此需要優化,本文章介紹了使用java8流操作以及hutool樹工具欄的建樹操作。
一、java8 流是什么
流是支持各種方法的對象序列(一系列對象,列入:LIst對象)
二、本次優化涉及操作
1.流去重
代碼如下(示例):
(操作對象).distinct().collect(Collectors.toList());
2.流分批
代碼如下(示例):
//一批500條int batchSize = 500;//賦值List<String> finalSysDistrictParentCodeStringList = sysDistrictParentCodeStringList;//對finalSysDistrictParentCodeStringList進行分批處理List<List<String>> batches = IntStream.range(0, (finalSysDistrictParentCodeStringList.size() + batchSize - 1) / batchSize).mapToObj(i -> finalSysDistrictParentCodeStringList.subList(i * batchSize, Math.min(finalSysDistrictParentCodeStringList.size(), (i + 1) * batchSize))).collect(Collectors.toList());
3.hutool樹工具類建樹
代碼如下(示例):
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();//設置id字段treeNodeConfig.setIdKey("code");//設置父級id字段treeNodeConfig.setParentIdKey("parentCode");List<Tree<String>> trees = TreeUtil.build(result, "0", treeNodeConfig, ((object, treeNode) -> {//對樹節點進行id賦值treeNode.setId(object.getCode());//id//對樹節點進行父級id賦值treeNode.setParentId(object.getParentCode());//父id//對樹節點進行名稱賦值treeNode.putExtra("name", object.getName());//對樹節點進行層級賦值treeNode.putExtra("level", object.getLevels());}));log.info("建樹后:{}",trees.size());
4.全部代碼
代碼如下(示例):
//實體類import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;import java.util.Map;
import java.util.Set;/*** 全國區域Demo*/
@Data
@ApiModel(value = "全國區域")
public class SysDistrictDemo extends BasePageQuery {/*** 編碼*/private String code;/*** 名稱*/private String name;/*** 父級編號*/private String parentCode;/*** 層級*/private Integer levels;}
//整體函數public R getTreeByLikeInfoDemo(SysDistrictDemo sysDistrictDemo) {QueryWrapper<SysDistrict> wrapper = new QueryWrapper<>();wrapper.like("name",sysDistrictDemo.getName());List<String> sysDistrictParentCodeStringList = "根據條件模糊查詢";log.info("去重前:{}",sysDistrictParentCodeStringList.size());//至此 取得所有數據 去重List<SysDistrictTree> result = new ArrayList<>();sysDistrictParentCodeStringList = sysDistrictParentCodeStringList.stream().distinct().collect(Collectors.toList());log.info("去重后:{}",sysDistrictParentCodeStringList.size());int batchSize = 500;List<String> finalSysDistrictParentCodeStringList = sysDistrictParentCodeStringList;List<List<String>> batches = IntStream.range(0, (finalSysDistrictParentCodeStringList.size() + batchSize - 1) / batchSize).mapToObj(i -> finalSysDistrictParentCodeStringList.subList(i * batchSize, Math.min(finalSysDistrictParentCodeStringList.size(), (i + 1) * batchSize))).collect(Collectors.toList());batches.forEach(codes->{result = "使用sql中in的查詢操作,例如:select a.id from a in #{codes}"});log.info("取值后:{}",result.size());TreeNodeConfig treeNodeConfig = new TreeNodeConfig();//設置id字段treeNodeConfig.setIdKey("code");//設置父級id字段treeNodeConfig.setParentIdKey("parentCode");List<Tree<String>> trees = TreeUtil.build(result, "0", treeNodeConfig, ((object, treeNode) -> {//對樹節點進行id賦值treeNode.setId(object.getCode());//id//對樹節點進行父級id賦值treeNode.setParentId(object.getParentCode());//父id//對樹節點進行名稱賦值treeNode.putExtra("name", object.getName());//對樹節點進行層級賦值treeNode.putExtra("level", object.getLevels());}));log.info("建樹后:{}",trees.size());return R.ok(trees);}
總結
自此完成了優化,本人是50s優化至7s,歡迎討論,勿噴,怕怕