Maison >Java >javaDidacticiel >Comment utiliser Springboot pour encapsuler une classe d'outil de conversion d'unités de données adaptatives
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 :
Donc, 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 : OuiEnsuite, 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 :
① Encapsulation préliminaire, utilisez la carte pour marquer les champs d'attributs de classe qui doivent être convertisComment 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 :
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 :
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) :
② Encapsulation plus poussée, coopérez avec les annotations personnalisées de vieux amis pour faire des choses
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.javaimport 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.javaps : 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 :
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!