Maison  >  Article  >  Java  >  Comment utiliser Springboot pour encapsuler une classe d'outil de conversion d'unités de données adaptatives

Comment utiliser Springboot pour encapsuler une classe d'outil de conversion d'unités de données adaptatives

WBOY
WBOYavant
2023-05-11 22:34:14991parcourir

    Avant-propos

    Je fais habituellement des données statistiques, et les données souvent obtenues à partir de la base de données ou de l'interface, l'unité n'est pas cohérente avec les exigences de l'entreprise.

    Par exemple, les points que nous avons retirés sont en fait des yuans

    Un autre exemple, les données que nous avons obtenues doivent être multipliées par 100 et renvoyées au front-end pour l'affichage du pourcentage

    Autre exemple, le rapport millième conversion

    à nouveau Par exemple, le montant retiré doit être converti en dizaines de milliers

    Un autre exemple est qu'il doit être maintenu à 2 décimales

    ...

    et ainsi de suite.

    Que faisons-nous habituellement ?

    Souvent, vous obtenez une liste de collecte de données, et vous devez la parcourir et effectuer des conversions d'unités pertinentes en fonction des attributs de chaque DTO.

    J'ai continué à recevoir et à définir, et à obtenir et à définir, et à obtenir et à définir, et à obtenir et à définir, et à obtenir et à définir, et tout le monde était engourdi.

    Comme ceci :

    Comment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptativesDonc, si certaines conversions d'opérations sont automatiquement mises en correspondance par réflexion, le code semblera plus confortable et les gens seront plus détendus.

    Réponse : Oui

    Ensuite, je l'ai fait.

    Le contenu de cet article est bref :

    ① Encapsulation préliminaire, en utilisant map pour marquer les champs d'attributs de classe qui doivent être convertis

    ② Encapsulation ultérieure, en travaillant avec les annotations personnalisées de vieux amis

    Produit :

    Le montant total du paiement est converti en unités de dizaines de milliers pour faciliter les statistiques opérationnelles

    De quel type de compte s'agit-il, s'il s'agit d'un pourcentage

    Ensuite, il y en a un autre qui est en millièmes ;

    En plus, il y en a 2 qu'il faut garder avec 2 décimales

    Et ah, ça ; . . . . .


    Moi :

    Arrête de parler et bois de l'eau.

    Les données obtenues sont toutes dans ce DTO :

    Démarrer l'encapsulation : Comment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptatives

    ① Encapsulation préliminaire, utilisez la carte pour marquer les champs d'attributs de classe qui doivent être convertis

    Comment jouer :

    a Get. par réflexion, extrayez les champs

    b. Utilisez la marque de conversion entrante Map pour faire correspondre les champs qui doivent être exploités

    c Ensuite, quelle est l'opération spécifique consistant à retirer les champs pertinents de la carte, puis effectuez l'opération de conversion.

    d. Réaffecter la valeur

    ① Simple à faire Enumération, répertorie les types d'opérations de conversion qui apparaissent sur les exigences

    UnitConvertType.java

    /**
     * @Author : JCccc
     * @CreateTime : 2023/01/14
     * @Description :
     **/
    public enum UnitConvertType {
     
        /**
         * 精度
         */
        R,
        /**
         * 万元
         */
        B,
        /**
         * 百分
         */
        PERCENTAGE,
        /**
         * 千分
         */
        PERMIL
    }

    ② Fonction de conversion encapsulée de base

    UnitConvertUtil.java

    import lombok.extern.slf4j.Slf4j;
    import java.lang.reflect.Field;
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    /**
     * @Author : JCccc
     * @CreateTime : 2023/01/14
     * @Description :
     **/
    @Slf4j
    public class UnitConvertUtil {
     
        public static <T> void unitMapConvert(List<T> list, Map<String, UnitConvertType> propertyMap) {
            for (T t : list) {
                Field[] declaredFields = t.getClass().getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    if (propertyMap.keySet().stream().anyMatch(x -> x.equals(declaredField.getName()))) {
                        try {
                            declaredField.setAccessible(true);
                            Object o = declaredField.get(t);
                            UnitConvertType unitConvertType = propertyMap.get(declaredField.getName());
                            if (o != null) {
                                if (unitConvertType.equals(UnitConvertType.PERCENTAGE)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.PERMIL)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.B)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).divide(new BigDecimal(10000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.R)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                            }
                        } catch (Exception ex) {
                            log.error("处理失败");
                            continue;
                        }
     
                    }
                }
            }
        }
        
        public static void main(String[] args) {
     
            //获取模拟数据
            List<MySumReportDTO> list = getMySumReportList();
     
            Map<String, UnitConvertType> map =new HashMap<>();
            map.put("payTotalAmount", UnitConvertType.B);
            map.put("jcAmountPercentage", UnitConvertType.PERCENTAGE);
            map.put("jcCountPermillage", UnitConvertType.PERMIL);
            map.put("length", UnitConvertType.R);
            map.put("width", UnitConvertType.R);
            unitMapConvert(list,map);
            System.out.println("通过map标识的自动转换玩法:"+list.toString());
     
        }
     
        private static List<MySumReportDTO> getMySumReportList() {
            MySumReportDTO mySumReportDTO = new MySumReportDTO();
            mySumReportDTO.setPayTotalAmount(new BigDecimal(1100000));
            mySumReportDTO.setJcAmountPercentage(BigDecimal.valueOf(0.695));
            mySumReportDTO.setJcCountPermillage(BigDecimal.valueOf(0.7894));
            mySumReportDTO.setLength(BigDecimal.valueOf(1300.65112));
            mySumReportDTO.setWidth(BigDecimal.valueOf(6522.12344));
     
            MySumReportDTO mySumReportDTO1 = new MySumReportDTO();
            mySumReportDTO1.setPayTotalAmount(new BigDecimal(2390000));
            mySumReportDTO1.setJcAmountPercentage(BigDecimal.valueOf(0.885));
            mySumReportDTO1.setJcCountPermillage(BigDecimal.valueOf(0.2394));
            mySumReportDTO1.setLength(BigDecimal.valueOf(1700.64003));
            mySumReportDTO1.setWidth(BigDecimal.valueOf(7522.12344));
     
            List<MySumReportDTO> list = new ArrayList<>();
     
            list.add(mySumReportDTO);
            list.add(mySumReportDTO1);
            return list;
        }
    }

    Analyse du code :

    Regardez comment l'appeler : Comment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptatives

    public static void main(String[] args) {
    
        //获取模拟数据
        List<MySumReportDTO> list = getMySumReportList();
        System.out.println("转换前:"+list.toString());
        Map<String, UnitConvertType> map =new HashMap<>();
        map.put("payTotalAmount", UnitConvertType.B);
        map.put("jcAmountPercentage", UnitConvertType.PERCENTAGE);
        map.put("jcCountPermillage", UnitConvertType.PERMIL);
        map.put("length", UnitConvertType.R);
        map.put("width", UnitConvertType.R);
        unitMapConvert(list,map);
        System.out.println("通过map标识的自动转换玩法:"+list.toString());
    }

    Brève analyse du code :

    Effet : Comment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptatives

    Les champs correspondants de toute la liste de collections sont automatiquement convertis avec succès (la logique de conversion peut être ajustée et développé dans le correspondant si si vous le souhaitez) : Comment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptatives

    ② Encapsulation plus poussée, coopérez avec les annotations personnalisées de vieux amis pour faire des chosesComment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptatives

    Pour être honnête, le niveau d'encapsulation dans la première étape est suffisant, c'est-à-dire passer la carte pour identifier celles qui doivent être converties et quel est le type d’énumération de conversion correspondant.

    En fait, je pense que c'est suffisant.

    Mais, afin de le rendre plus pratique à utiliser, ou plus évolutif, il serait plus sympa d'utiliser des annotations personnalisées.

    Faisons-le.

    Créez une annotation personnalisée, JcBigDecConvert.java

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
     
    /**
     * @Author : JCccc
     * @CreateTime : 2023/01/14
     * @Description :
     **/
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface JcBigDecConvert {
     
        UnitConvertType name();
    }

    Comment l'utiliser ? Marquez simplement les champs dans notre rapport DTO.

    Exemple :

    MyYearSumReportDTO.java

    ps : Vous pouvez voir que nous utilisons des annotations personnalisées sur les champs

    import lombok.Data;
    import java.io.Serializable;
    import java.math.BigDecimal;
     
    /**
     * @Author : JCccc
     * @CreateTime : 2023/2/03
     * @Description :
     **/
     
    @Data
    public class MyYearSumReportDTO implements Serializable {
        private static final long serialVersionUID = 5285987517581372888L;
     
        //支付总金额
        @JcBigDecConvert(name=UnitConvertType.B)
        private BigDecimal payTotalAmount;
     
        //jc金额百分比
        @JcBigDecConvert(name=UnitConvertType.PERCENTAGE)
        private BigDecimal jcAmountPercentage;
     
        //jc计数千分比
        @JcBigDecConvert(name=UnitConvertType.PERMIL)
        private BigDecimal jcCountPermillage;
     
        //保留2位
        @JcBigDecConvert(name=UnitConvertType.R)
        private BigDecimal length;
     
        //保留2位
        @JcBigDecConvert(name=UnitConvertType.R)
        private BigDecimal width;
    }

    Ensuite, pour faire correspondre notre personnalisation, scellez une fonction de conversion, réfléchissez pour obtenir le champ d'attribut, puis analysez l'annotation , Effectuez ensuite les opérations de conversion correspondantes.

    Code : Comment utiliser Springboot pour encapsuler une classe doutil de conversion dunités de données adaptatives

        public static <T> void unitAnnotateConvert(List<T> list) {
            for (T t : list) {
                Field[] declaredFields = t.getClass().getDeclaredFields();
                for (Field declaredField : declaredFields) {
                        try {
                            if (declaredField.getName().equals("serialVersionUID")){
                                continue;
                            }
                            JcBigDecConvert myFieldAnn = declaredField.getAnnotation(JcBigDecConvert.class);
                            if(Objects.isNull(myFieldAnn)){
                                continue;
                            }
                            UnitConvertType unitConvertType = myFieldAnn.name();
                            declaredField.setAccessible(true);
                            Object o = declaredField.get(t);
                            if (Objects.nonNull(o)) {
                                if (unitConvertType.equals(UnitConvertType.PERCENTAGE)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.PERMIL)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).multiply(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.B)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).divide(new BigDecimal(10000)).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                                if (unitConvertType.equals(UnitConvertType.R)) {
                                    BigDecimal bigDecimal = ((BigDecimal) o).setScale(2, BigDecimal.ROUND_HALF_UP);
                                    declaredField.set(t, bigDecimal);
                                }
                            }
                        } catch (Exception ex) {
                            log.error("处理失败");
                        }
                }
            }
        }

    Écrivez un exemple d'appel pour voir l'effet :

        public static void main(String[] args) {
            
            List<MyYearSumReportDTO> yearsList = getMyYearSumReportList();
            unitAnnotateConvert(yearsList);
            System.out.println("通过注解标识的自动转换玩法:"+yearsList.toString());
        }
        
        private static List<MyYearSumReportDTO> getMyYearSumReportList() {
            MyYearSumReportDTO mySumReportDTO = new MyYearSumReportDTO();
            mySumReportDTO.setPayTotalAmount(new BigDecimal(1100000));
            mySumReportDTO.setJcAmountPercentage(BigDecimal.valueOf(0.695));
            mySumReportDTO.setJcCountPermillage(BigDecimal.valueOf(0.7894));
            mySumReportDTO.setLength(BigDecimal.valueOf(1300.65112));
            mySumReportDTO.setWidth(BigDecimal.valueOf(6522.12344));
            MyYearSumReportDTO mySumReportDTO1 = new MyYearSumReportDTO();
            mySumReportDTO1.setPayTotalAmount(new BigDecimal(2390000));
            mySumReportDTO1.setJcAmountPercentage(BigDecimal.valueOf(0.885));
            mySumReportDTO1.setJcCountPermillage(BigDecimal.valueOf(0.2394));
            mySumReportDTO1.setLength(BigDecimal.valueOf(1700.64003));
            mySumReportDTO1.setWidth(BigDecimal.valueOf(7522.12344));
            
            List<MyYearSumReportDTO> list = new ArrayList<>();
            list.add(mySumReportDTO);
            list.add(mySumReportDTO1);
            return list;
        }

    L'effet est également très bon :

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer