文章目录
Java选择结构语句的几种形式
Java中的选择结构语句主要用于基于不同条件执行不同的代码块。主要有以下几种形式:
1. if 单选择结构:
当需要根据一个条件决定是否执行某段代码时使用。
if (条件) {
// 条件为true时执行的代码
}
2. if-else 双选择结构:
当有两个互斥的执行路径时使用。
if (条件) {
// 条件为true时执行的代码
} else {
// 条件为false时执行的代码
}
3. if-else if 多选择结构:
用于多个条件判断,当一个条件满足时,执行对应代码块,并跳出整个if结构。
if (条件1) {
// 条件1为true时执行的代码
} else if (条件2) {
// 条件1为false且条件2为true时执行的代码
} else if (条件3) {
// 如果前面条件都不满足,且条件3为true时执行的代码
} else {
// 所有条件都不满足时执行的代码
}
4. switch 选择结构:
适用于基于某个变量的不同取值执行不同代码块的情况。
switch (变量) {
case 常量1:
// 变量等于常量1时执行的代码
break;
case 常量2:
// 变量等于常量2时执行的代码
break;
// 可以有多个case
default:
// 如果没有匹配的case时执行的代码
}
在使用选择结构时,需要注意以下几点:
- 条件判断后的代码块应使用大括号
{}
括起来,即使只有一行代码,也推荐这样做以增强代码的可读性和避免潜在错误。 switch
语句中的case
后面必须跟一个常量表达式,且在switch
中不能有重复的case
值。- 在
switch
语句中,break
语句用于结束当前case
并跳出switch
结构,如果不使用break
,程序会继续执行下一个case
直到遇到break
或switch
结束。 - Java 12及更高版本中,还可以使用
switch
表达式,它可以直接返回一个值,语法更加简洁灵活。
让我们继续深入探讨Java中的选择结构和其他相关高级话题。
Java 12及更高版本的Switch Expressions
从Java 12开始,Java引入了更加灵活和强大的switch
表达式,它不仅可以作为语句使用,还能作为表达式直接返回一个值。这使得代码更加简洁、易读,并且在某些情况下,减少了对break
语句的依赖。下面是switch
表达式的几个关键特性:
返回值的Switch表达式
String day = "Monday";
String result = switch (day) {
case "Monday", "Friday" -> "Work hard!";
case "Saturday", "Sunday" -> "Relax!";
default -> "It's just another day.";
};
System.out.println(result);
在这个例子中,switch
表达式根据day
的值返回不同的字符串,注意这里使用了逗号分隔来合并多个case
分支,并且不需要显式地写出break
。
yield关键字
在switch
表达式中,yield
关键字用于从某个分支返回一个值。如果一个分支没有包含yield
,则编译器会报错。
int number = 3;
String result = switch (number) {
case 1 -> "One";
case 2 -> "Two";
case 3 -> {
System.out.println("Processing case 3...");
yield "Three"; // 使用yield返回值
}
default -> "Other";
};
System.out.println(result);
使用Switch作为语句或表达式
虽然Java 12开始推荐使用switch
作为表达式,但传统的switch
语句依然可用,特别是在不涉及返回值的情况下。选择哪种形式取决于具体需求。
Pattern Matching for instanceof
(Java 16+)
自Java 16起,引入了模式匹配的instanceof
操作符,允许在instanceof
判断后直接解构对象并赋值给变量,简化了类型转换和判空的操作。
Object obj = getObject(); // 假设此方法返回Object类型的实例
if (obj instanceof String s) { // 如果obj是String类型,则解构为s
System.out.println(s.length());
} else if (obj instanceof Integer i) { // 如果obj是Integer类型,则解构为i
System.out.println(i.doubleValue());
} else {
System.out.println("Not a String or Integer.");
}
在这个例子中,当obj
是String
类型时,直接将其转换并赋值给s
;同理,如果是Integer
类型,则赋值给i
。这种方式减少了代码的冗余,提高了可读性。
总结
Java的选择结构是控制程序流程的基础,从基础的if-else
到高级的switch
表达式,再到模式匹配的instanceof
,这些结构为处理多种条件分支提供了灵活而强大的手段。随着Java版本的演进,这些结构也在不断进化,以更好地支持现代编程的需求。掌握这些内容对于编写高效、清晰的Java代码至关重要。
Java选择结构在实际编程中的应用。
接下来通过几个实用案例来展示Java选择结构在实际编程中的应用。
1. 用户角色权限判断
假设在一个系统中,根据用户角色显示不同的功能菜单。
enum UserRole {
ADMIN, MODERATOR, USER
}
public class RoleBasedMenu {
public static void displayMenu(UserRole role) {
switch (role) {
case ADMIN:
System.out.println("Admin Menu: Manage Users, Manage Content, View Reports");
break;
case MODERATOR:
System.out.println("Moderator Menu: Approve Content, Manage Comments");
break;
case USER:
System.out.println("User Menu: Read Content, Comment");
break;
default:
System.out.println("Unknown Role");
}
}
public static void main(String[] args) {
UserRole currentUserRole = UserRole.ADMIN;
displayMenu(currentUserRole);
}
}
2. 订单状态处理
在电商系统中,根据订单的不同状态执行相应的业务逻辑。
enum OrderStatus {
PENDING, PAID, SHIPPED, DELIVERED, CANCELLED
}
public class OrderProcessor {
public void processOrder(OrderStatus status) {
if (status == OrderStatus.PAID) {
System.out.println("Initiate shipping process.");
} else if (status == OrderStatus.SHIPPED) {
System.out.println("Notify customer about shipment.");
} else if (status == OrderStatus.DELIVERED) {
System.out.println("Mark order as completed.");
// 可能还有退款、评价等后续操作
} else if (status == OrderStatus.CANCELLED) {
System.out.println("Process refund.");
} else if (status == OrderStatus.PENDING) {
System.out.println("Awaiting payment confirmation.");
} else {
System.out.println("Invalid order status.");
}
}
public static void main(String[] args) {
OrderProcessor processor = new OrderProcessor();
processor.processOrder(OrderStatus.PAID);
}
}
3. 学生成绩等级划分
根据学生的考试分数划分成绩等级。
public class GradeCalculator {
public String calculateGrade(int score) {
return switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
case 6 -> "D";
default -> "F";
};
}
public static void main(String[] args) {
GradeCalculator calculator = new GradeCalculator();
System.out.println(calculator.calculateGrade(85)); // 应输出 'B'
}
}
以上案例展示了在实际应用场景中,如何利用Java的选择结构(包括if-else
和switch
)来根据不同的条件执行相应的逻辑,从而实现程序的动态行为。
4. 天气预报应用
考虑一个天气预报应用,根据当天的天气情况提供给用户不同的建议。
public class WeatherAdvisor {
public String giveAdvice(String weatherCondition) {
return switch (weatherCondition.toLowerCase()) {
case "sunny" -> "It's sunny outside. Perfect day for a picnic!";
case "rainy" -> "Remember to carry an umbrella. It's going to rain.";
case "cloudy" -> "Cloudy day, might be a good idea to bring a light jacket.";
case "snowy" -> "Stay warm and drive safely; the roads might be slippery.";
default -> "Weather condition not recognized. Please check your input.";
};
}
public static void main(String[] args) {
WeatherAdvisor advisor = new WeatherAdvisor();
System.out.println(advisor.giveAdvice("Sunny")); // 输出: It's sunny outside. Perfect day for a picnic!
}
}
5. 购物车结算优惠计算
在线购物平台中,根据用户购买的商品总金额提供不同的折扣。
public class DiscountCalculator {
public double calculateDiscount(double totalAmount) {
if (totalAmount >= 500 && totalAmount < 1000) {
return totalAmount * 0.1; // 10% discount
} else if (totalAmount >= 1000 && totalAmount < 2000) {
return totalAmount * 0.15; // 15% discount
} else if (totalAmount >= 2000) {
return totalAmount * 0.2; // 20% discount
} else {
return 0; // No discount for amounts less than 500
}
}
public static void main(String[] args) {
DiscountCalculator calculator = new DiscountCalculator();
double totalAmount = 1500.0;
System.out.printf("Your discount is: %.2f%n", calculator.calculateDiscount(totalAmount)); // 输出: Your discount is: 225.00
}
}
6. 图书分类展示
假设有一个图书管理系统,需要根据图书的类型展示不同的封面设计。
public class BookCoverDesigner {
public String getCoverDesign(String bookGenre) {
return switch (bookGenre.toLowerCase()) {
case "fantasy" -> wanx(" prompt: A mystical forest with magical creatures, book title: 'Fantasy Realm' ");
case "mystery" -> wanx(" prompt: An old library with dim lighting, book title: 'The Unsolved Enigma' ");
case "romance" -> wanx(" prompt: A sunset beach with two silhouettes, book title: 'Love's Dusk' ");
default -> "Standard cover design for unknown genre.";
};
}
public static void main(String[] args) {
BookCoverDesigner designer = new BookCoverDesigner();
String fantasyCoverPrompt = designer.getCoverDesign("Fantasy");
System.out.println(fantasyCoverPrompt);
}
}
请注意,在实际运行第6个案例时,由于我无法直接调用外部API,您需要自行替换wanx
函数的调用来获取真实的图像URL。不过,这个案例展示了如何根据不同的条件(这里是图书类型)动态生成或选择不同的内容(如封面设计)。
————————————————
最后我们放松一下眼睛