Rumah  >  Artikel  >  Java  >  Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

WBOY
WBOYke hadapan
2023-05-11 22:34:14991semak imbas

    Kata Pengantar

    Saya biasanya melakukan beberapa data statistik, dan data yang sering diperolehi daripada pangkalan data atau antara muka, unit tersebut tidak konsisten dengan keperluan perniagaan.

    Sebagai contoh, sen yang kami keluarkan sebenarnya ialah yuan

    Contoh lain ialah data yang kami peroleh perlu didarabkan dengan 100 dikembalikan ke bahagian hadapan untuk paparan peratusan

    Contoh lain ialah penukaran keseribu

    Contoh lain ialah amaun yang dibawa keluar perluditukar kepada unit daripada puluhan ribu

    Untuk contoh lain, anda perlu mengekalkan 2 tempat perpuluhan

    ...

    dan seterusnya.

    Apa yang biasa kita lakukan?

    Banyak kali perkara yang anda perolehi ialah senarai pengumpulan data dan anda perlu merentasinya dan melakukan penukaran unit yang berkaitan berdasarkan atribut setiap DTO.

    Ia terus mendapat dan menetapkan, dan mendapat dan menetapkan, dan mendapat dan menetapkan, dan mendapat dan menetapkan, dan mendapat dan menetapkan, dan orang menjadi kebas.

    Begini:

    Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

    Jadi, jika sesetengah penukaran operasi dipadankan secara automatik melalui refleksi, kod akan kelihatan lebih selesa dan orang akan lebih santai. sedikit.

    Jawapan: Ya

    Kemudian, saya melakukannya.

    Kandungan artikel ini ringkas:

    ① Enkapsulasi awal, menggunakan peta untuk menandakan medan atribut kelas yang perlu ditukar

    ② Pakej Selanjutnya, bekerjasama dengan anotasi tersuai rakan lama untuk melakukan sesuatu

    Produk:

    Jumlah amaun bayaran ditukar kepada unit daripada puluhan ribu untuk memudahkan statistik operasi;

    Berapa kiraan, jika ia adalah peratusan; terdapat 2 yang perlu mengekalkan 2 tempat perpuluhan; . . . . .

    Saya:


    Berhenti bercakap dan minum air.

    Data yang diperoleh semuanya dalam DTO ini:

    Mulakan pembungkusan:

    ① Pembungkusan awal, melalui peta Tandakan medan atribut kelas yang perlu ditukar

    Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif Idea dan permainan:

    a perlu dikendalikan

    c. Kemudian apakah operasi khusus untuk mengekstrak medan yang berkaitan daripada peta, dan kemudian melaksanakan operasi penukaran

    d ① Hanya buat penghitungan dan senaraikannya sekarang Jenis operasi penukaran atas permintaan

    UnitConvertType.java

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

    ② Fungsi penukaran terkapsul teras

    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;
        }
    }
    >Analisis kod:

    Lihat cara memanggilnya:

    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());
    }

    Analisis kod:

    Kesan:

    Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

    Medan yang sepadan bagi keseluruhan senarai koleksi berjaya ditukar secara automatik (anda boleh melaraskan dan mengembangkan logik penukaran dalam yang sepadan jika anda suka):

    Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

    ② Enkapsulasi lanjut, bekerjasama dengan anotasi tersuai rakan lama untuk melakukan sesuatu

    Sejujurnya, langkah pertama pengkapsulan sudah memadai, iaitu lulus peta untuk mengenal pasti yang mana perlu ditukar, dan penghitungan penukaran yang sepadan Apakah jenisnya.

    Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptifSebenarnya, saya rasa sudah memadai.

    Walau bagaimanapun, untuk menjadikannya lebih mudah digunakan, atau lebih berskala, adalah lebih baik untuk menggunakan anotasi tersuai.

    Jom buat. Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

    Buat anotasi tersuai, bagaimana untuk menggunakan 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();
    }

    ? Hanya tandakan medan dalam DTO laporan kami.

    Contoh:

    MyYearSumReportDTO.java

    ps: Anda boleh lihat bahawa kami menggunakan anotasi tersuai

    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;
    }

    pada medan dan kemudian sepadan dengan Definisi tersuai kami , mengelak fungsi penukaran, dapatkan medan atribut melalui pantulan, kemudian huraikan anotasi, dan kemudian lakukan operasi penukaran yang sepadan.

    Kod:

        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("处理失败");
                        }
                }
            }
        }

    Tulis contoh panggilan untuk melihat kesan:

        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;
        }

    Kesannya juga sangat baik:

    Atas ialah kandungan terperinci Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam