Ich erstelle normalerweise einige statistische Daten aus der Datenbank oder der Schnittstelle ist dasselbe wie Geschäftsanforderungen sind inkonsistent. Nr Die Daten müssen
mit 100multipliziert und zur Prozentanzeige an das Frontend zurückgegeben werden Der entnommene Betrag muss# 🎜🎜#in zehntausend Einheiten umgewandelt werdenEin weiteres Beispiel: Sie müssen 2 Dezimalstellen beibehalten
#🎜🎜 #... und so weiter.
Was machen wir normalerweise?
Oft erhalten Sie eine Datenerfassungsliste, die Sie durchlaufen und relevante Einheitenumrechnungen basierend auf den Attributen jedes DTO durchführen müssen. Weitermachen, fertig, fertig, fertig, fertig, fertig, die Leute sind taub.
ist wie folgt:
Wenn also einige Vorgangskonvertierungen automatisch durch Reflektion abgeglichen werden, müssen Sie sich das ansehen Der Code? Dadurch fühlen Sie sich wohler und entspannter.Antwort: Ja
Dann habe ich es geschafft. Der Inhalt dieses Artikels ist kurz:① Vorläufige Kapselung, Verwendung einer Karte zum Markieren der zu konvertierenden Klassenattributfelder # 🎜🎜##🎜 🎜#
② Weitere Kapselung, Zusammenarbeit mit den benutzerdefinierten Anmerkungen alter Freunde, um Dinge zu bewirkenProdukt: #🎜 🎜#
# 🎜🎜#Der Gesamtzahlungsbetrag wird in Einheiten von Zehntausenden umgerechnet. Was für eine Zählung ist es? 🎜#
Ich:
Hör auf zu reden und trink etwas Wasser.Die erhaltenen Daten befinden sich alle in diesem DTO:
Verpackung starten:
# 🎜 🎜#① Vorläufige Kapselung, markieren Sie mit der Karte die zu konvertierenden KlassenattributfelderWie man spielt: A ##🎜 🎜#b Verwenden Sie das eingehende Konvertierungs-Tag Map, um zuzuordnen, welche Felder bearbeitet werden müssen. c Konvertierungsoperation
d. Neu zuweisen① Erstellen Sie einfach eine Aufzählung, um die Konvertierungsoperationstypen aufzulisten, die in der Anforderung UnitConvertType.java#🎜 angezeigt werden 🎜#
/** * @Author : JCccc * @CreateTime : 2023/01/14 * @Description : **/ public enum UnitConvertType { /** * 精度 */ R, /** * 万元 */ B, /** * 百分 */ PERCENTAGE, /** * 千分 */ PERMIL }② Core Encapsulated-Konvertierungsfunktion 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; } }
Code-Analyse:
#🎜 🎜 #
Look So rufen Sie an: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()); }
Effekt:
#🎜 🎜##🎜🎜 #Die entsprechenden Felder der gesamten Kollektionsliste werden automatisch erfolgreich konvertiert (die Konvertierungslogik kann im entsprechenden Bereich beliebig angepasst und erweitert werden):
#🎜 🎜#
② Weitere Kapselung, Zusammenarbeit mit den benutzerdefinierten Anmerkungen alter Freunde, um Dinge möglich zu machenUm ehrlich zu sein, reicht der erste Schritt der Kapselung aus , die die Karte übergeben soll, um zu identifizieren, welche konvertiert werden müssen. Was ist der entsprechende Konvertierungsaufzählungstyp? Eigentlich habe ich das Gefühl, dass es reicht. Aber um es benutzerfreundlicher oder skalierbarer zu machen, wäre es schöner, benutzerdefinierte Anmerkungen zu verwenden. Lass es uns tun. Erstellen Sie eine benutzerdefinierte Anmerkung, 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(); }Wie verwende ich sie? Markieren Sie einfach die Felder in unserem Berichts-DTO.
Beispiel:
MyYearSumReportDTO.java
ps: Sie können sehen, dass wir benutzerdefinierte Anmerkungen für die Felder
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; }#🎜 🎜 verwendet haben # Um dann unserer Anpassung zu entsprechen, versiegeln Sie eine Konvertierungsfunktion, rufen Sie das Attributfeld durch Reflektion ab, analysieren Sie dann die Anmerkung und führen Sie dann den entsprechenden Konvertierungsvorgang aus.
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("处理失败"); } } } }
Schreiben Sie ein Anrufbeispiel, um den Effekt zu sehen:
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; }
The Wirkung ist auch sehr ok:
Das obige ist der detaillierte Inhalt vonSo kapseln Sie mit Springboot eine Toolklasse für die Konvertierung adaptiver Dateneinheiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!