0

0

Java实现电话键盘字母转数字:Switch表达式与Stream API教程

花韻仙語

花韻仙語

发布时间:2025-10-10 10:27:32

|

996人浏览过

|

来源于php中文网

原创

Java实现电话键盘字母转数字:Switch表达式与Stream API教程

本教程将指导您如何在Java中将单词转换为符合电话键盘标准的数字序列,例如'Software'变为'76389273'。我们将利用Java 14+的switch表达式和Stream API,通过简洁高效的代码实现字符到数字的映射和字符串的构建,从而提供一种现代且可维护的解决方案。

引言:电话键盘字母到数字的映射

在许多应用场景中,我们需要将文本中的字母转换为数字,最常见的例子就是电话键盘上的字母映射规则。例如,字母'a'、'b'、'c'对应数字'2','d'、'e'、'f'对应'3',以此类推。本教程将详细介绍如何使用java的现代特性,特别是switch表达式和stream api,高效且优雅地实现这一转换。

传统的实现方式可能涉及遍历字符串中的每个字符,然后在一个while或for循环中使用switch语句进行判断,并将结果逐个存储到一个集合中。这种方法虽然可行,但在处理结果存储和代码简洁性方面可能遇到一些挑战,例如原始数组无法直接使用add方法,以及变量作用域问题等。为了解决这些问题并提升代码的可读性和效率,我们将采用Java 14+引入的switch表达式和Java 8引入的Stream API。

使用Switch表达式进行字符到数字映射

switch表达式是Java 14及更高版本中引入的一项特性,它允许switch语句作为表达式使用,可以直接返回值,从而使代码更加简洁。结合Lambda风格的箭头语法,可以大大减少冗余代码。

首先,我们定义一个辅助方法getNumber,用于将单个字符转换为对应的数字。

public static int getNumber(char j) {
    return switch (j) {
        case 'A', 'B', 'C', 'a', 'b', 'c' -> 2;
        case 'D', 'E', 'F', 'd', 'e', 'f' -> 3;
        case 'G', 'H', 'I', 'g', 'h', 'i' -> 4;
        case 'J', 'K', 'L', 'j', 'k', 'l' -> 5;
        case 'M', 'N', 'O', 'm', 'n', 'o' -> 6;
        case 'P', 'Q', 'R', 'S', 'p', 'q', 'r', 's' -> 7;
        case 'T', 'U', 'V', 't', 'u', 'v' -> 8;
        case 'W', 'X', 'Y', 'Z', 'w', 'x', 'y', 'z' -> 9;
        default -> 0; // 处理非字母字符,例如数字、符号或空格
    };
}

在这个方法中:

立即学习Java免费学习笔记(深入)”;

HaiSnap
HaiSnap

一站式AI应用开发和部署工具

下载
  • 我们使用了switch表达式,它直接返回一个int值。
  • case标签支持多值匹配,例如case 'A', 'B', 'C',这使得代码更加紧凑。
  • 箭头语法->替代了传统的:和break,避免了break遗漏导致的错误。
  • default -> 0处理了所有未匹配的字符,例如输入中可能包含的数字、符号或空格,它们将被映射为0。您可以根据需求调整此默认行为。

结合Stream API进行字符串处理

Java Stream API提供了一种声明式处理数据集合的方式,非常适合对字符串中的字符进行转换和聚合操作。我们可以利用Stream API将输入字符串转换为字符流,然后对每个字符应用getNumber方法,并将结果数字拼接成一个字符串,最终转换为整数。

import java.util.stream.Collectors;

public class PhoneNumberConverter {

    // getNumber方法如上所示

    public static int getPhoneNumber(String word) {
        // 将字符串转换为字符流 (int stream)
        return Integer.valueOf(word.chars()
            // 将每个字符 (int) 映射为对应的数字字符串
            .mapToObj(ch -> String.valueOf(getNumber((char) ch)))
            // 将所有数字字符串连接起来形成一个完整的数字字符串
            .collect(Collectors.joining()));
    }

    public static void main(String[] args) {
        String inputWord = "Software";
        int phoneNumber = getPhoneNumber(inputWord);
        System.out.println("单词 '" + inputWord + "' 转换为数字是: " + phoneNumber); // 输出: 单词 'Software' 转换为数字是: 76389273

        inputWord = "Hello World!";
        phoneNumber = getPhoneNumber(inputWord);
        System.out.println("单词 '" + inputWord + "' 转换为数字是: " + phoneNumber); // 输出: 单词 'Hello World!' 转换为数字是: 43556096753
    }
}

在getPhoneNumber方法中:

  1. word.chars(): 将输入字符串word转换为一个IntStream,其中每个int代表一个字符的ASCII值。
  2. .mapToObj(ch -> String.valueOf(getNumber((char) ch))): 这是Stream管道的核心。
    • ch是当前字符的ASCII值。
    • (char) ch将其转换回char类型。
    • getNumber((char) ch)调用我们之前定义的getNumber方法,将字符转换为对应的数字。
    • String.valueOf(...)将这个数字转换为字符串,因为collect(Collectors.joining())需要处理String对象。
  3. .collect(Collectors.joining()): 将所有由mapToObj生成的数字字符串连接起来,形成一个表示最终电话号码的完整字符串。
  4. Integer.valueOf(...): 将最终的数字字符串转换为一个int类型的整数。

完整代码示例

将上述两个方法组合,构成一个完整的Java程序,实现从单词到电话号码的转换。

import java.util.stream.Collectors; // 导入Collectors类

public class PhoneNumberConverter {

    /**
     * 将单个字符转换为电话键盘上对应的数字。
     * 支持大小写字母,非字母字符映射为0。
     *
     * @param j 要转换的字符
     * @return 对应的数字
     */
    public static int getNumber(char j) {
        return switch (j) {
            case 'A', 'B', 'C', 'a', 'b', 'c' -> 2;
            case 'D', 'E', 'F', 'd', 'e', 'f' -> 3;
            case 'G', 'H', 'I', 'g', 'h', 'i' -> 4;
            case 'J', 'K', 'L', 'j', 'k', 'l' -> 5;
            case 'M', 'N', 'O', 'm', 'n', 'o' -> 6;
            case 'P', 'Q', 'R', 'S', 'p', 'q', 'r', 's' -> 7;
            case 'T', 'U', 'V', 't', 'u', 'v' -> 8;
            case 'W', 'X', 'Y', 'Z', 'w', 'x', 'y', 'z' -> 9;
            default -> 0; // 处理非字母字符
        };
    }

    /**
     * 将整个单词转换为电话键盘数字序列。
     *
     * @param word 要转换的单词字符串
     * @return 转换后的数字整数
     */
    public static int getPhoneNumber(String word) {
        // 使用Stream API处理字符串中的每个字符
        String numberString = word.chars()
            // 将每个字符(int)映射为对应的数字字符串
            .mapToObj(ch -> String.valueOf(getNumber((char) ch)))
            // 将所有数字字符串连接成一个
            .collect(Collectors.joining());

        // 将最终的数字字符串转换为整数
        // 注意:如果生成的数字序列过长,可能会超出int的最大值,此时应考虑使用long或String
        return Integer.valueOf(numberString);
    }

    public static void main(String[] args) {
        // 示例用法
        String word1 = "Software";
        System.out.println("单词 '" + word1 + "' 转换为数字是: " + getPhoneNumber(word1)); // 76389273

        String word2 = "Hello World!"; // 包含空格和感叹号
        System.out.println("单词 '" + word2 + "' 转换为数字是: " + getPhoneNumber(word2)); // 43556096753 (W和!转换为0)

        String word3 = "Java123"; // 包含数字
        System.out.println("单词 '" + word3 + "' 转换为数字是: " + getPhoneNumber(word3)); // 528000
    }
}

注意事项与总结

  1. Java版本要求: 本教程中使用的switch表达式语法(带箭头->和多值case标签)需要Java 14或更高版本。如果您的项目使用旧版Java,则需要使用传统的switch语句(带:和break)。
  2. IntStream与Stream: String.chars()返回的是IntStream,其元素是字符的ASCII值。如果需要操作Character对象,可以使用word.chars().mapToObj(c -> (char) c)将其转换为Stream
  3. 大数字处理: Integer.valueOf()方法会将字符串转换为int类型。如果转换后的数字序列非常长(例如,超过9-10位),可能会超出int类型的最大值(约21亿),导致NumberFormatException。在这种情况下,应考虑使用Long.valueOf()或直接将结果作为String类型返回。
  4. 错误处理与输入验证: getNumber方法中的default -> 0处理了非字母字符。在实际应用中,您可能需要更严格的输入验证,例如在getPhoneNumber方法开头检查输入字符串是否为空或只包含特定字符。
  5. 代码可读性与维护性: 结合switch表达式和Stream API的解决方案,相比于传统的循环和嵌套if-else或冗长的switch语句,代码更加简洁、易读,且易于维护。它以声明式的方式表达了“如何转换”,而不是“一步步如何转换”,符合现代Java编程范式。

通过本教程,您应该已经掌握了如何利用Java的现代特性,优雅地实现单词到电话号码的转换。这种方法不仅高效,而且代码清晰,是处理类似字符映射问题的推荐实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

780

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

541

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

423

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

119

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

258

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 8万人学习

Java 教程
Java 教程

共578课时 | 53.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号