self.MFD=dict(map(lambda x:(self.index_node[x],self._slope(x,weight=weight)),self.g.nodes))
时间: 2024-06-14 17:06:47 浏览: 148
根据提供的引用内容,你提到了一个关于self.MFD的操作,其中使用了map函数和lambda表达式。根据代码片段的描述,这段代码的作用是将self.g中的节点映射为self.index_node中的索引,并使用self._slope函数计算权重。最后,将节点和权重以字典的形式存储在self.MFD中。
以下是一个类似的示例代码,演示了如何使用map函数和lambda表达式来实现这个操作:
```python
self.MFD = dict(map(lambda x: (self.index_node[x], self._slope(x, weight=weight)), self.g.nodes))
```
这段代码将self.g中的每个节点x作为输入,通过lambda表达式将节点映射为self.index_node中的索引,并使用self._slope函数计算权重。最后,将节点和权重以字典的形式存储在self.MFD中。
相关问题
procedure pcreate; //创建文件 label a,b; begin write('User name?'); readln(x); for i:=1 to 5 do if x=mfd[i]^.username then goto b; //找到匹配的跳b writeln(x,'not been logined !'); goto a; //找不到匹配的跳a b:write('New file name?'); readln(x); p2:=mfd[i]^.link; if p2^. filename=x then {检查是否与用户的第一个文件重名} begin writeln('File has existed!'); goto b; end; while p2^.next<>NIL {检查是否与用另外的文件重名} do begin p2:=p2^.next; if p2^.filename=x then begin writeln('file has existed!'); goto b; end; end; new(q2); //创建新的文件节点q2 q2^.next:=NIL; q2^.filename:=' '; p2^.next:=q2; p2^.filename:=x; repeat write('Protection code?'); readln(y1);val(y1,y,code); until code=0; p2^.pcode:=y; p2^.length:=0; writeln('Create finished !'); a:end; 设置数据域pcode的目的是什么?请说明如何发挥它的作用?
数据域`pcode`的目的是为了设置文件的保护码,即文件访问权限。通过设置不同的保护码,可以限制不同用户对文件的访问权限,保护文件的安全性。
在程序中,当创建新文件时,会要求用户设置保护码,并将其存储在文件节点的`pcode`数据域中。在后续的文件操作中,如果用户想要访问该文件,程序会要求用户输入保护码进行验证,只有输入正确的保护码才能够访问该文件。这样就可以达到控制用户对文件的访问权限的目的。
private void checkGoodsStock(Goods goods, Integer buyNum) { //商品为现货商品,判断商品现货可用库存 if (GoodsSaleType.SPOT == GoodsSaleType.findSaleType(goods.getSaleType())) { //单个商品、意向商品 if (GoodsShelveType.SINGLE.getShelveType() == goods.getShelveType() || GoodsShelveType.INTENTION.getShelveType() == goods.getShelveType()) { BaseGoods baseGoods = iBaseGoodsService.getOne(Wrappers.<BaseGoods>lambdaQuery().in(BaseGoods::getModel, goods.getModel()).last("for update")); if (buyNum > baseGoods.getSpotOccupyStock()) { throw new ServiceException(ErrorMessage.STOCK_ERROR); } } //组合商品 if (GoodsShelveType.COMBINATION.getShelveType() == goods.getShelveType()) { //查询组合商品子商品信息 List<GoodsChilds> goodsChildsList = goodsChildsService.lambdaQuery().eq(GoodsChilds::getParentId, goods.getId()).eq(GoodsChilds::getIsGift, 0).list(); if (CollectionUtils.isEmpty(goodsChildsList)) { throw new ServiceException("组合商品子商品信息为空"); } //子商品所有商品型号 List<String> goodsChildsModelList = goodsChildsList.stream().map(GoodsChilds::getModel).collect(Collectors.toList()); List<BaseGoods> baseGoodsList = iBaseGoodsService.list(Wrappers.<BaseGoods>lambdaQuery().in(BaseGoods::getModel, goodsChildsModelList).last("for update")); Map<String, BaseGoods> baseGoodsMap = AppUtils.listToMap(baseGoodsList, BaseGoods::getModel); for (GoodsChilds goodsChilds : goodsChildsList) { BaseGoods baseGoods = baseGoodsMap.get(goodsChilds.getModel()); if (baseGoods == null) { throw new ServiceException("商品型号不存在"); } //子商品总购买数 Integer goodsChildsBuyNum = goodsChilds.getNumberCoefficient().multiply(new BigDecimal(buyNum)).intValue(); if (goodsChildsBuyNum > baseGoods.getSpotOccupyStock()) { throw new ServiceException(ErrorMessage.STOCK_ERROR); } } } } //非现货商品,判断上架库存 if (GoodsSaleType.SPOT != GoodsSaleType.findSaleType(goods.getSaleType()) && buyNum > goods.getStock()) { throw new ServiceException(ErrorMessage.STOCK_ERROR); } }优化该段代码
这段代码可以进行以下优化:
1. 将数据查询和判断库存的逻辑分离,可以提高代码的可读性和可维护性。
2. 对于组合商品的处理,可以使用批量查询替代循环查询。同时,可以将子商品总购买数的计算提取出来,避免重复计算。
3. 可以通过使用缓存来提高查询性能,避免每次都查询数据库。
综上所述,可以进行如下优化:
```
private void checkGoodsStock(Goods goods, Integer buyNum) {
//商品为现货商品,判断商品现货可用库存
if (GoodsSaleType.SPOT == GoodsSaleType.findSaleType(goods.getSaleType())) {
//单个商品、意向商品
if (GoodsShelveType.SINGLE.getShelveType() == goods.getShelveType() || GoodsShelveType.INTENTION.getShelveType() == goods.getShelveType()) {
BaseGoods baseGoods = iBaseGoodsService.getOne(Wrappers.<BaseGoods>lambdaQuery().eq(BaseGoods::getModel, goods.getModel()).last("for update"));
int availableStock = baseGoods.getSpotOccupyStock();
if (buyNum > availableStock) {
throw new ServiceException(ErrorMessage.STOCK_ERROR);
}
}
//组合商品
else if (GoodsShelveType.COMBINATION.getShelveType() == goods.getShelveType()) {
//查询组合商品子商品信息
List<GoodsChilds> goodsChildsList = goodsChildsService.lambdaQuery().eq(GoodsChilds::getParentId, goods.getId()).eq(GoodsChilds::getIsGift, 0).list();
if (CollectionUtils.isEmpty(goodsChildsList)) {
throw new ServiceException("组合商品子商品信息为空");
}
//子商品所有商品型号
List<String> goodsChildsModelList = goodsChildsList.stream().map(GoodsChilds::getModel).collect(Collectors.toList());
//批量查询子商品库存
List<BaseGoods> baseGoodsList = iBaseGoodsService.list(Wrappers.<BaseGoods>lambdaQuery().in(BaseGoods::getModel, goodsChildsModelList).last("for update"));
//使用Map存储子商品库存信息,避免重复查询
Map<String, BaseGoods> baseGoodsMap = baseGoodsList.stream().collect(Collectors.toMap(BaseGoods::getModel, Function.identity()));
for (GoodsChilds goodsChilds : goodsChildsList) {
BaseGoods baseGoods = baseGoodsMap.get(goodsChilds.getModel());
if (baseGoods == null) {
throw new ServiceException("商品型号不存在");
}
//计算子商品总购买数
int goodsChildsBuyNum = goodsChilds.getNumberCoefficient().multiply(new BigDecimal(buyNum)).intValue();
int availableStock = baseGoods.getSpotOccupyStock();
if (goodsChildsBuyNum > availableStock) {
throw new ServiceException(ErrorMessage.STOCK_ERROR);
}
}
}
}
//非现货商品,判断上架库存
else if (buyNum > goods.getStock()) {
throw new ServiceException(ErrorMessage.STOCK_ERROR);
}
}
```
以上代码中,我将查询库存信息和计算可用库存的逻辑分离,使用批量查询和Map来提高查询性能,同时提取子商品总购买数的计算,避免重复计算。
阅读全文