Menu
CoddyTech

模式匹配

本课属于 Coddy Java 学习旅程的“逻辑与流程”单元。第 37 课,共 59 课。

Java 中的模式匹配可以用来测试对象是否具有特定类型,并从中提取组成部分。它简化了类型检查和类型转换操作。

来看看如何将模式匹配与 instanceof 搭配使用:

Object obj = "Hello";
if (obj instanceof String str) {
   // str 会自动转换为 String 类型
   System.out.println(str.toUpperCase());
}

运行上面的代码后,输出为:

"HELLO"

你也可以用 else if 串联模式匹配检查:

Object value = 42;
String result;
if (value instanceof Integer i) {
    result = "Number: " + i;
} else if (value instanceof String s) {
    result = "Text: " + s;
} else {
    result = "Unknown";
}

执行上述代码后,result 的内容为:

“Number: 42”

challenge icon

挑战

简单

创建一个名为 processValue 的方法,它接受一个参数:

  1. 一个可能属于不同数据类型的对象(value)

该方法应使用 instanceof 模式匹配来处理这个值,并根据以下规则返回一个字符串:

  • 如果它是 Integer:返回 "Number: ",后面跟着加倍后的值
  • 如果它是 String:返回 "Text: ",后面跟着转换为大写的值
  • 如果它是 Boolean:返回 "Boolean: ",后面跟着相反的值(true 变为 false,反之亦然)
  • 对于任何其他类型:返回 "Unknown"

亲手试试

import java.util.Scanner;

public class Main {
    public static String processValue(Object value) {
        // TODO:使用 instanceof 模式匹配处理这个值
        // 如果是 Integer:返回 "Number: " + (value * 2)
        // 如果是 String:返回 "Text: " + value.toUpperCase()
        // 如果是 Boolean:返回 "Boolean: " + (!value)
        // 对于其他类型:返回 "Unknown"
        
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String type = scanner.nextLine();
        String inputValue = scanner.nextLine();
        
        Object value = switch(type) {
            case "Integer" -> Integer.parseInt(inputValue);
            case "String" -> inputValue;
            case "Boolean" -> Boolean.parseBoolean(inputValue);
            default -> inputValue;
        };
        
        System.out.println(processValue(value));
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Java 在线编译器