たとえば、取り出した セント は、実際には 元です
別の例として、取得したデータは を掛ける必要があります。 100
パーセンテージ表示のためフロントエンドに戻ります。別の例は、1000 分の 1 の換算です。別の例は、取り出した金額を 1 万単位に換算する必要がある場合です
別の例では、小数点以下 2 桁を保持する必要があります
....などです。 私たちは普段何をしているのでしょうか? 多くの場合、取得するのはデータ収集リストであり、それを調べて、各 DTO の属性に基づいて関連する単位変換を実行する必要があります。 取得して設定、取得して設定、取得して設定、取得して設定、取得して設定を繰り返すと、誰もがしびれてしまいます。 次のように: したがって、一部の操作変換がリフレクションを通じて自動的に一致すると、コードはより快適に見え、人々はよりリラックスするでしょう。少し。答え: はい
それで、やりました。 この記事の内容は簡単です:① 変換する必要があるクラス属性フィールドをマークするためのマップを使用した予備的なカプセル化
② さらにカプセル化して、古い友人のカスタム アノテーションと協力して実行します。
取得されたデータはすべてこの DTO にあります: カプセル化の開始: ① マップを介した予備のカプセル化 To マーク変換する必要があるクラス属性フィールドプレイ方法: a. リフレクションを通じてフィールドを取り出すb. 受信した変換マーク マップを使用して、どのフィールドと一致させるかフィールドを操作する必要があります c. 次に、マップから関連するフィールドを抽出し、変換操作を実行するための具体的な操作は何ですか d. 値製品:
支払い総額は 10 に換算されます運用統計を容易にするための 1,000 単位;これはどのような種類のカウントですか? パーセントの場合; 次に、1000 あたりのパーセントである別のカウントもあります;さらに、小数点以下 2 桁を保持する必要があるものがさらに 2 つあります。 それと、それです。 。 。 。 。 。
私:
話をやめて、水を飲みましょう。
## を再割り当てします#① 列挙を作成し、オンデマンドで現在の変換操作タイプをリストするだけです。
UnitConvertType.java
/** * @Author : JCccc * @CreateTime : 2023/01/14 * @Description : **/ public enum UnitConvertType { /** * 精度 */ R, /** * 万元 */ B, /** * 百分 */ PERCENTAGE, /** * 千分 */ PERMIL }
② コアのカプセル化された変換関数
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; } }
コード分析:
呼び出し方法を見てください:
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()); }
コード分析:
効果:
コレクション リスト全体の対応するフィールドは自動的に正常に変換されます (必要に応じて、変換ロジックを調整し、対応するフィールドで拡張できます):
正直に言うと、最初のステップのカプセル化のレベルで十分です。変換する必要があるものを識別するためのマップと、対応する変換列挙型を渡すことです。
実のところ、私はそれで十分だと感じています。
しかし、より使いやすく、またはよりスケーラブルにするためには、カスタム アノテーションを使用した方がよいでしょう。 ###### やりましょう。
カスタム アノテーション 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(); }
を作成します。その使用方法は?レポート DTO のフィールドをマークするだけです。
例:
My YearSumReportDTO.java
ps: フィールド
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; }
にカスタム アノテーションを使用し、カスタム定義と一致していることがわかります。変換関数をシールし、リフレクションによって属性フィールドを取得し、注釈を解析して、対応する変換操作を実行します。
コード:
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("处理失败"); } } } }
効果を確認するための呼び出し例を作成します:
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; }
効果も非常に優れています:
以上がSpringboot を使用して適応型データ単位変換ツール クラスをカプセル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。