在 Java 中替换掉繁杂的 if 语句

Windows系统下载安装 Git 的详细教程 本文详细介绍了Windows系统下载安装Git的完整流程,包括从Git官方网站和阿里镜像下载安装包,逐步讲解安装向导中的各个设置选项,如安装路径、默认编辑器、行尾转换、终端模拟器等,并提供了每个步骤的截图和说明。安装完成后,博客还介绍了如何验证安装是否成功,以及如何配置Git的用户名和邮箱,确保可以正常使用Git进行版本控制。 阅读详情

if else每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。

一、简述

通常会遇到一些需要做一系列条件处理的业务逻辑,并且它们每一个都需要不同的处理。来看一下 Calulator(计算器)类的一个例子。下面是带有两个数字类型参数,一个操作符参数以及基于操作的数值返回值的一个方法:

public int calculate(int a, int b, String operator) {
    int result = Integer.MIN_VALUE;
    if ("add".equals(operator)) {
        result = a + b;
    } else if ("subtract".equals(operator)) {
        result = a - b;
    } else if ("multiply".equals(operator)) {
        result = a * b;
    } else if ("divide".equals(operator)) {
        result = a / b;
    }
    return result;
}

通常也能使用 switch 语句来操作:

public int calculate(int a, int b, String operator) {
    int result = Integer.MIN_VALUE;
    switch (operator) {
        case "add":
            result = a + b;
        case "multiply":
            result = a * b;
        case "divide":
            result = a / b;
        case "subtract":
            result = a - b;
            break;
    }
    return result;
}

switch 语句其实并没有任何实质性的优化。嵌套条件声明编程使得程序变得难以管理。如果需要新添加一个操作,相应需要添加一个新的 if 条件以及条件的实现,甚至需要回归整个业务代码。

二、工厂类

经常遇见许多条件声明,它们是用来处理每个分支中相似的操作。可以提取一个返回具体类型的对象并且根据具体对象行为执行操作的工厂类。例如,定义一个带有单独的 apply 方法的操作接口:

public interface CalOperation {
	int apply(int a, int b);
}

单独定义业务类:
加:

public class Addition implements CalOperation {
	@Override
	public int apply(int a, int b) {
		return a + b;
	}
}

减:

public class Subtraction implements CalOperation {
	@Override
	public int apply(int a, int b) {
		return a - b;
	}
}

乘:

public class Multiplication implements CalOperation {
	@Override
	public int apply(int a, int b) {
		return a * b;
	}
}

除:

public class Division implements CalOperation {
	@Override
	public int apply(int a, int b) {
		return a / b;
	}
}

现在实现一个基于给定操作符返回相应结果的工程类:

public class OperatorFactory {
	static Map<String, CalOperation > operationMap = new HashMap<>();
    //在静态块中先把初始化工作全部做完	
    static {
		operationMap.put("add", new Addition());
        operationMap.put("subtract", new Subtraction());
        operationMap.put("multiply", new Multiplication());
		operationMap.put("divide", new Division());
	}
	public static CalOperation getOperation(String operator) {
		return operationMap.get(operator);
	}
}

在 Calculator 类中,能够通过查询工厂来获取相关的操作并且应用于其中:

public class Calculator {
   public String cal( String operator) {
   // 一行代码搞定!之前的 if/else也没了!
   return OperatorFactory.getOperation(operator).apply(); 
   }
}

该例通过工厂类来将逻辑业务责任分发委托给一系列轻耦合对象。但是如果只是简单地将嵌套 if 语句转移成工厂类,这明显不符合预期。作为另外的选择,通过维护能够被快速查询的对象仓库map(映射),来达成目的。也可以在运行时定义映射对象并且配置它们用于查找。这样的话以后想扩展条件也很容易,只需要增加新代码,而不需要动以前的业务代码,非常符合“开闭原则”。

三、命令模式(command pattern)

使用工厂类可以返回指定操作符的对应的业务对象实例,该实例用于 Claculator 类中执行计算操作。也可以设计一个 Calculator.calculate 方法来接收一个可以执行输入的指令。这是另外一种来代替嵌套 if 语句的方法。定义一个 Command 接口:

public interface Command {
	Integer execute();
}

其中一个实现类 AddCommand:

public class AddCommand implements Command {
    private int a;
    private int b;
	public AddCommand(int a, int b) {
		this.a = a;
		this.b = b;
	}
	@Override
	public Integer execute() {
		return a + b;
	}
}

最后,在 Calculator 类中定义一个用于接收操作和执行操作的新方法:

public class Calculator {
    public int calculate(Command command) {
        return command.execute();
    }
}

通过实例化 AddCommand 对象并且将它作为参数传递到 Calculator.calculate 方法当中用以调用计算方法:

@Test
public void whenCalculateUsingCommand_thenReturnCorrectResult() {
	Calculator calculator = new Calculator();
	int result = calculator.calculate(new AddCommand(3, 7));
	assertEquals(10, result);
}

四、策略模式

策略模式和工厂模式写起来其实区别也不大!

在上面工厂模式代码的基础上,按照策略模式的指导思想,来创建一个所谓的策略上下文类,这里命名为 CalContext:

public class CalContext {
    private CalOperation calOperation;
    public CalContext(CalOperation calOperation) {
        this.calOperation = calOperation;
    }
    public int execute(int a, int b) {
        return calOperation.apply(a, b);
    }
}

很明显上面传入的参数 calOperation 就是表示不同的“策略”。在业务代码里传入不同的角色,即可得到不同的操作结果:

public class Calculator {
    public int apply(int a, int b, CalOperation calOperation) {
        CalContext calContext = new CalContext(calOperation);
        return calContext.execute(a, b);
    }
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        int add = calculator.apply(6, 2, new Addition());
        System.out.println(add);
        int sub = calculator.apply(6, 2, new Subtraction());
        System.out.println(sub);
        int mul = calculator.apply(6, 2, new Multiplication());
        System.out.println(mul);
        int div = calculator.apply(6, 2, new Division());
        System.out.println(div);
    }
}

五、使用枚举

除了映射对象(map)的使用之外,也可以使用枚举来标记特定的逻辑业务。在这之后,能通过它来代替嵌套 if 语句或者 swtich 语句。作为其它处理,也可以使用它们作为对象工厂并且整理用于处理相关的业务逻辑操作。这会减少嵌套 if 语句的数量并且将业务责任委托给独立的枚举变量中。定义一个枚举类:

public enum CalEnum{
	ADD, SUBTRACT, MULTIPLY, DIVIDE
}

这些值是不同操作符的标签,并且会运用到之后的计算当中。就像嵌套 if 语句和 switch 语句那样,可以将这些值当作选项来使用。然而,可以设计一种能够将逻辑委托给枚举本身的替代方法,为每一个枚举量都定义了各自的方法并且进行了计算操作。例如:

CalOperation 类:

public interface CalOperation {
    int apply(int a, int b);
}

CalEnum 类:

public enum CalEnum implements CalOperation {
    //加
    ADD {
        @Override
        public int apply(int a, int b) {
            return a + b;
        }
    },
    //减
    MULTIPLY {
        @Override
        public int apply(int a, int b) {
            return a - b;
        }
    },
    //乘
    SUBTRACT {
        @Override
        public int apply(int a, int b) {
            return a * b;
        }
    },
    //除
    DIVIDE {
        @Override
        public int apply(int a, int b) {
            return a / b;
        }
    }
}

调用如下:

public class Calculator {
    public int apply(int a, int b, String calOperation) {
        // 一行代码搞定!之前的if/else没了!
        return CalEnum.valueOf(calOperation).apply(a, b);
    }
    public static void main(String[] args) {
        CalClass cc = new CalClass();
        int add = cc.apply(1, 2, "MULTIPLY");
        System.out.println(add);
    }
}

六、规则引擎(rule engine)

当编写了大量的嵌套 if 语句时,每一个条件都描述了特定的业务规则,用于评估正确逻辑操作的执行。规则引擎将这些复杂的判断从主代码中去掉。规则引擎是用于评估规则并且基于输入返回结果。这个规则引擎是通过一组规则来处理表达式,并从选中的规则返回结果。定义一个规则接口:

public interface Rule {
	boolean evaluate(Expression expression);
	Result getResult();
}

接着,来实现一个规则引擎:

public class RuleEngine {
	private static List<Rule> rules = new ArrayList<>();
	static {
		rules.add(new AddRule());
	}
	public Result process(Expression expression) {
		Rule rule = rules.stream()
                         .filter(r -> r.evaluate(expression))
                         .findFirst()
				.orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule"));
		return rule.getResult();
	}
}

这个规则引擎接收一个表达式并且返回 Result。现在,设计一个带有两个数值变量以及一个用于操作的 Operator 对象的表达式类:

public class Expression {
  private Integer x;
  private Integer y;
  private Operator operator; 
}

最后,定义一个 AddRule 类,它只在加操作中使用到:

public class AddRule implements Rule {
  @Override
  public boolean evaluate(Expression expression) {
  boolean evalResult = false;
  if (expression.getOperator() == Operator.ADD) {
  this.result = expression.getX() + expression.getY();
  evalResult = true;
}
  return evalResult;
  } 
}

现在,可以使用 Expression 来调用 RuleEngine 了:

@Test
public void whenNumbersGivenToRuleEngine_thenReturnCorrectResult() {
 Expression expression = new Expression(5, 5, Operator.ADD);
 RuleEngine engine = new RuleEngine();
 Result result = engine.process(expression);
 
 assertNotNull(result);
 assertEquals(10, result.getValue());
}

七、提前 return

这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码:

if(condition){
  //do something
}else{
  return xxx;
}

其实,完全可以先判断 !condition,干掉else。

if(!condition){
  return xxx;
}
  //do something

八、Optional主要用于非空判断,jdk8新特性

使用之前:

if(user == null){
  //do action1
}else{
  //do action2
}

如果登录用户为空,执行 action1,否则执行 action 2。使用 Optional 优化之后,让非空校验更加优雅,间接的减少 if 操作:

Optional<User> userOptional = Optional.ofNullable(user);
userOptional.map(action1) .orElse(action2);

九、数组小技巧

来自 google 解释,这是一种编程模式,叫做表驱动法,本质是从表里查询信息来代替逻辑语句,比如有这么一个场景,通过月份来获取当月的天数,仅作为案例演示,数据并不严谨。一般的实现:

public int getDays(int month) {
       if (month == 1) {
           return 31;
       } else if (month == 2) {
           return 29;
       } else if (month == 3) {
           return 31;
       } else if (month == 4) {
           return 30;
       } else if (month == 5) {
           return 31;
       } else if (month == 6) {
           return 30;
       } else if (month == 7) {
           return 31;
       } else if (month == 8) {
           return 31;
       } else if (month == 9) {
           return 30;
       } else if (month == 10) {
           return 31;
       } else if (month == 11) {
           return 30;
       } else if (month == 12) {
           return 31;
       }
       return 0;
}

优化后的代码:

int[] monthDays = {
        31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
public int getDays(int month) {
    return monthDays[--month];
}
20、Citrix 云桌面常见VDA注册问题汇总 本文总结了与 VDA 中出现的 VDA 会话断开连接、注册、会话卡住以及挂起/崩溃相关的主要支持文章。 阅读详情

相关推荐

R语言计算植物群落重要值:从基础概念到优势种判定

在植被生态学研究中,重要值是衡量物种在群落中地位的核心指标,它综合了相对多度、相对频度与相对显著度三个维度,能够客观反映物种的数量优势、分布广度与空间占据能力。理解重要值的生态学逻辑,是开展群落分类、优势种判定及多样性分析的基础。而R语言凭借其批量处理、可复现和与后续多元统计无缝衔接的优势,成为生态学研究者处理样方数据的高效工具。从野外记录的宽表到标准化长表,再到分组汇总计算相对指标,R语言能够显著提升数据处理效率与准确性。本文以实测群落数据为例,系统梳理重要值的两种算法口径、基于dplyr和tidyr的完

weixin_42634811的博客 265

java if 替代_在Java中替换掉繁杂的if语句

if else每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。一、简述通常会遇到一些需要做一系列条件处理的业务逻辑,并且它们每一个都需要不同的处理。来看一下 Calulator(计算器)类的一个例子。下面是带有两个数字类型参数,一个操作符参数以及基于操作的数值返回值的一个方法:publi...

weixin_35523284的博客 2110

RM机器人麦轮底盘实战:从零搭建到PID调参全记录(附避坑指南)

本文详细记录了RM机器人麦轮底盘从零搭建到PID调参的全过程,涵盖硬件组装、开发环境搭建、底盘解算和PID调参等关键步骤,并附有实用的避坑指南。特别针对麦轮控制、底盘解算和电机调试等核心问题提供了专业解决方案,帮助开发者快速提升机器人性能。

bush的博客 372

使用规则执行器替换java中if语句

使用规则执行器替换java中if语句干掉 if else,让代码容易扩展1.首先2.用户基类3.规则校验基类4.用户信息校验规则基类5.用户校验规则实现类,这里我写了两个,分别校验(UserInfo.addr是否以北京开头)和(UserInfo.age>=18)6.最重要的规则实现类7.测试 干掉 if else,让代码容易扩展 在公众号(链接:https://mp.weixin.qq.com/s/33S0KgZuGjddwY9gyAa1Iw)中看到这样一个规则执行器用来替换掉大量的if语句,本想在本

weixin_40187536的博客 1107

ComfyUI新手必看:JoyCaption 2插件安装全流程(附百度网盘资源)

本文为ComfyUI新手提供了JoyCaption 2插件的完整安装与部署指南。详细介绍了从环境准备、插件获取、模型文件配置到核心节点使用的全流程,并重点解析了其集成的LLM反推模式,帮助用户高效实现从图片到精准提示词的转换。

mango的博客 303

避开STM32H7的‘保护陷阱’:从Option Byte机制深度解析读写保护原理与预防

本文深度解析STM32H723VGT6的Option Byte保护机制,详细讲解RDP读保护和WRP写保护的工作原理及配置方法,并提供硬件设计防御策略和软件预防性编程技巧,帮助开发者避免误触发保护机制导致芯片锁定的问题。

weixin_33686714的博客 441

java1.8的函数接口代替if-esle

java1.8的函数接口代替if-esle

weixin_40631648的博客 1622

开放平台 - 互动玩法演进之路

随着直播业务和用户规模日益壮大,如何丰富直播间内容、增强直播间内用户互动效果,提升营收数据变得更加关键。

bilibili_TC的博客 1739

java:问号冒号(?:)表达式--用于简化if...else条件判断代码

语言:java 问题:使用if…else判断条件,虽然阅读起来更容易,但是代码量比较大。如何简化代码? 解决方法:问号冒号表达式(?:) //if...else写法 if (creaseendTs != null && creaseendTs.length() != 0) { hjwGyjCycle.put("creasestart_time", sdf1.format(new Date(Long.parseLong(creasebeginTs)))); hjwGyjCycle.pu.

weixin_43815750的博客 4016

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2936

YOLOv11改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 584

Java 判空新写法!干掉 if else 啦

https://mp.weixin.qq.com/s/zJpkOShGA14WcXWdholChA

竹林幽深 445

基于DWA算法的机器人动态避障技术实现及matlab代码

DWA算法是一种基于轨迹的运动规划算法,其核心思想是:在机器人当前位置及速度的基础上,结合机器人感知到的环境信息,生成一组合法的速度指令,然后从这组速度指令中选取代价最小的速度指令作为机器人的下一步操作。下面,我们将通过一个实例来演示基于DWA算法的机器人动态避障技术实现。假设机器人在一个宽敞的场地内行驶,但场地内有一些固定障碍物和移动障碍物,机器人需要避开这些障碍物,并在场地内自由移动。本文给出了一种基于DWA算法的机器人动态避障技术实现及相应的matlab代码,读者可以根据自身需求进行修改和调整。

uote_e的博客 1003

java用什么替换if_在Java中替换掉繁杂的if语句

通常我们会遇到一些需要做一系列条件处理的业务逻辑,并且它们每一个都需要不同的处理。为了演示,我们来看一下Calulator(计算器)类的一个例子。下面是带有两个数字类型参数,一个操作符参数以及基于操作的数值返回值的一个方法:public int calculate(int a, int b, String operator) {int result = Integer.MIN_VALUE;if (...

weixin_31437187的博客 2375

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

在Java中替换掉繁杂的if语句

通常我们会遇到一些需要做一系列条件处理的业务逻辑,并且它们每一个都需要不同的处理。为了演示,我们来看一下Calulator(计算器)类的一个例子。下面是带有两个数字类型参数,一个操作符参数以及基于操作的数值返回值的一个方法: public int calculate(int a, int b, String operator) { int result = Integer....

weixin_34167043的博客 452

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

翻译 | 怎么在Java中替换掉繁杂的if语句

原文自工程师baeldung博客,传送门 可关注我们的收藏夹,最新的翻译文章都在这里。 1. 概述 决策结构在大多数编程语言中占据了至为重要的一步。但是我们常常会被大量的那种让代码变得难读且难维护的内嵌if语句搞得浑身难受。 在这次的教程中,我们将来过一下可以代替内嵌if语句的各种方法。让我们来探索简化我们代码的途径吧。 2. 案例学习 通常我们会遇到一些需要做一系列条件处理的业务逻辑,并...

weixin_34119545的博客 296

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

使用策略模式消除代码中繁杂的if-else

说明 基于SpringBoot,使用策略模式进行封装,意在消除代码中繁杂的if-else。 示例 public interface SchoolService { String handler(); } @Component @HandlerOrder(type = SchoolService.class) public class ChinaSchoolServiceImpl im...

qq_35003055的博客 735

实现if_干掉过多的if…else:据说这项技能可以看出程序员的境界!

转自:博客园,作者:艾瑞克·邵,www.cnblogs.com/eric-shao/p/10115577.html前言if...else是所有高级编程语言都有的必备功能。但现实中的代码往往存在着过多的 if...else。虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性、可维护性造成很大伤害,进而危害到整个软件系统。现在软件开发领域出现了很多新技术、新概念...

weixin_39717692的博客 143

Spring Boot 如何干掉 if else?

点击上方“全球Java架构师集中营”,选择“设为星标”技术文章第一时间送达!作者:cipherhttp://www.ciphermagic.cn/spring-boot-...

Java架构师集中营 118

来看看如何使用策略模式干掉讨厌的 if else

干掉if else常用策略模式!其实就是抽取一个抽象类,然后根据类型指定不同的实现类执行方法。你学废了吗? 需求 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 订单实体: service接口: 传统实现 根据订单类型写一堆的if else: 策略模式实现 利用策略模式,只需要两行即可实现业务逻辑: 可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一.

LoveSummer 2001

python的url中加入变量的值_python,_如何替换url中的参数值?,python - phpStudy

如何替换url中的参数值?大家好,我是python新手,想写一个测试目录遍历的小脚本,遇到了问题,求各位大牛指教!python 2.7.8 windows 7 x64位测试url:http://www.waitalone.cn/index.php?id=123&abc=456&xxx=ooo其实参数名值对个数不是固定的,这里我只是以3个为准测试。payloads = ('../b...

weixin_39546520的博客 1067

GOTO 语句有害论 | 反对 GOTO 语句的理由

……

u013669912的博客 1874

Java SPI 机制:接口标准化与应用实践解析

Java SPI 机制:接口标准化与应用实践解析

weixin_45415187的博客 1101

策略模式+元注解方式替代大量if else写法

1、策略模式简介 设计模式的知识可以参考我的设计模式笔记专栏:设计模式系列博客 策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换。也就是将一系列算法封装到一系列策略类里面。策略模式是一种对象行为型模式。策略模式符合“开闭原则“ Strategy Pattern: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm

Nicky's blog 3901

java txt 操作_java操作txt文件

java操作文本文件个人认为最繁杂的是修改操作!需要重写整个文本!好了不说了先贴代码!public class txtfile {public void txtfileQ() throws IOException{//txt文件的查询FileReader fr =new FileReader("c://a.txt");BufferedReader br = new BufferedR...

weixin_29353431的博客 3194

怎样避免 i f 判断过多,全复杂度较高,代码不美观的问题?

没有什么好的设计方式可以实现,减少一个方法中出现几十个 if 匹配的判断? 现在要做一个判断客户是否通过验证的接口。 一共有30多个验证规则的判断, 每个规则对应一个规则号; 这个接口只需要返回是否验证通过 接口参数是一个数组,数组里面放入的是需要验证哪些规则的规则号; 我想到的比较原始的方法可能是 /** * 验证客户是否通过验证 * @param rules 需要验证的多条规则的对应码的数组 ...

weixin_30454481的博客 327
上一篇: 策略模式(Strategy Pattern)
下一篇: 建造者模式(Builder Pattern)
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值