apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/ItemsComparator.java/ItemsComparator/compareIgnoreBlankAndCommentItem
class ItemsComparator:  public ItemChangeSets compareIgnoreBlankAndCommentItem(long baseNamespaceId, List<ItemDTO> baseItems, List<ItemDTO> targetItems){
    List<ItemDTO> filteredSourceItems = filterBlankAndCommentItem(baseItems);
    List<ItemDTO> filteredTargetItems = filterBlankAndCommentItem(targetItems);

    Map<String, ItemDTO> sourceItemMap = BeanUtils.mapByKey("key", filteredSourceItems);
    Map<String, ItemDTO> targetItemMap = BeanUtils.mapByKey("key", filteredTargetItems);

    ItemChangeSets changeSets = new ItemChangeSets();

    for (ItemDTO item: targetItems){
      String key = item.getKey();

      ItemDTO sourceItem = sourceItemMap.get(key);
      if (sourceItem == null){//add
        ItemDTO copiedItem = copyItem(item);
        copiedItem.setNamespaceId(baseNamespaceId);
        changeSets.addCreateItem(copiedItem);
      }else if (!Objects.equals(sourceItem.getValue(), item.getValue())){//update
        //only value & comment can be update
        sourceItem.setValue(item.getValue());
        sourceItem.setComment(item.getComment());
        changeSets.addUpdateItem(sourceItem);
      }
    }

    for (ItemDTO item: baseItems){
      String key = item.getKey();

      ItemDTO targetItem = targetItemMap.get(key);
      if(targetItem == null){//delete
        changeSets.addDeleteItem(item);
      }
    }

    return changeSets;
  }