java中的映射思想(map)

java中的映射思想(map)

学会如何将一个值转换为另一个值(映射思想:map))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEWuyas8-1597722882463)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597721897960.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNsspFOl-1597722882466)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597722182242.png)]

当我们选择4-7天时,前端传过来的数据是2,那么我们怎么将2转换为4-7去查询呢?
   分析:
	dayType      范围值
    	1         [0,3]
    	2         [4,7]
        3         [8,14]
 上面数据结构类似java中map映射结构
 Map<Integer,?>map=....       
 ---------------------------------------------------------------- 
    范围值可以使用数字或list来存储,约定第一个值为min,第二个值为max,我们可以使用封装类TravelCondition(vo) 
  class TravelCondition {
      private int min;
      private int max;
      public  TravelCondition(int min,int max){...}
	//这个数据需要在类创建时就有,而不是调用时产生,所以我们需要将它放到静态代码块中,随类初始化
       public static final Map<Integer,TravelCondition>DAY_MAP=new HashMap<>();
      static{
      DAY_MAP.put(1,new TravelCondition(0,3))
      DAY_MAP.put(2,new TravelCondition(4,7))
      DAY_MAP.put(3,new TravelCondition(8,14))
      ...
      }
 }
 ------------------------------------------------------   
   实现步骤:
	1.先初始化好上面映射map,将dayType跟范围对象映射初始化好
	2.页面选择出行天数,假设是4-7,页面往后端传入 dayType=2
     3.controller中的qo对象接受dayType=2这个参数,调用map.get(dayType)
       TravelCondition con =map.get(2)
     4.再sql拼接就可以使用con对象了
vo对象
//将一个值转换为多个值,注意映射思想
@Getter
public class TravelCondition {
    public static final Map<Integer, TravelCondition> MAP_DAY = new HashMap<>();
    private int min;
    private int max;

    static {
        MAP_DAY.put(1, new TravelCondition(0, 3));
        MAP_DAY.put(2, new TravelCondition(4, 7));
        MAP_DAY.put(3, new TravelCondition(8, 14));
        MAP_DAY.put(4, new TravelCondition(15, Integer.MAX_VALUE));//最大20亿多
    }
    public TravelCondition(int min, int max) {
        this.min = min;
        this.max = max;
    }
}
service层(mongodb高级查询)
  @Override
    public Page<Travel> query(TravelQuery qo) {
        Query query = new Query();
         //先获取对象travelCondition,里面封装了对应的最大,最小天数
        TravelCondition travelCondition = TravelCondition.MAP_DAY.get(qo.getDayType());
        if (travelCondition != null) {
            query.addCriteria(Criteria.where("day").gte(travelCondition.getMin()).lte(travelCondition.getMax()));
        }
        //先获取对象travelCondition,里面封装了对应的最大,最小人均花费
        TravelCondition con = TravelCondition.MAP_EXPEND.get(qo.getPerExpendType());
        if (con != null) {
            query.addCriteria(Criteria.where("perExpend").gte(con.getMin()).lte(con.getMax()));
        }
        //最新/最热排序
         PageRequest pageable = null;
        if (qo.getOrderType() == TravelQuery.TRAVEL_NEW) {
            //最新用发布时间倒序排
            pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "releaseTime");
        } else if (qo.getOrderType() == TravelQuery.TRAVEL_HOT) {
            //最热用点赞数倒序排
            pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "thumbsupnum");
        } else {
            //默认按照id排
            pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "_id");
        }
        //查询总条数
         long count = template.count(query, Travel.class);
        if (count == 0) {
            return Page.empty();
        }
        //拼接条件
        query.with(pageable);
        //查询符号条件的数据
        List<Travel> list = template.find(query, Travel.class);
       
        return new PageImpl<>(list, pageable, total);
小结
1.一般来说,如果分析出来的数据结构没有现有的domain对象进行封装,可以自定义出vo(value Object)对象对数据进行自定义封装
2.先分析出数据结构,可以用对象封装目的地和攻略分类的list集合,也可以使用map集合
3.数据组装方式
	方案1:
		1>查询出strategy_catalog 所有destName,并且排除重复,得到目的地名称集合
		2>迭代目的地名称集合,以名称作为条件查询strategy_catalog得到该目的地下攻略分类的集合List<StrategyCatalog>maplist
		3>组装成list<CatalogVO>list集合
	方案2:mongodb 聚合查询
	//主要是思想,当我们看到这种类似的结构时,就应该推测出它的大概结构
	//如果该结构domian中没有定义的字段时,我们可以使用自定义类vo来封装他们
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值