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

Cara menggunakan Springboot untuk merangkum kelas alat penukaran unit data adaptif

WBOY
Lepaskan: 2023-05-11 22:34:14
ke hadapan
1067 orang telah melayarinya

    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
    }
    Salin selepas log masuk

    ② 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;
        }
    }
    Salin selepas log masuk
    >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());
    }
    Salin selepas log masuk

    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();
    }
    Salin selepas log masuk

    ? 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;
    }
    Salin selepas log masuk

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

    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;
        }
    Salin selepas log masuk

    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!

    Label berkaitan:
    sumber:yisu.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan