You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java提取字符串中大写字母方法的优化方案咨询

Java提取字符串中大写字母方法的优化方案咨询

嘿,你的这个实现其实已经挺靠谱的了!边界情况(null、空字符串、无大写字母)都考虑到了,用StringBuilder的循环写法性能也很扎实。不过确实有几种更简洁或者更贴合现代Java风格的写法,我给你梳理几个方向,你可以根据自己的场景选:

一、用正则表达式简化代码

正则可以一行搞定过滤逻辑,代码非常简洁:

import java.util.Objects;

public static String getCapitalsOnly(String sentence) {
    if (Objects.isNull(sentence) || sentence.isEmpty()) {
        return "No message is given.";
    }
    String caps = sentence.replaceAll("[^A-Z]", "");
    return caps.isEmpty() ? "There are no capital letters in your message." : caps;
}

这里[^A-Z]是匹配所有非大写英文字母的字符,用空字符串替换掉就剩下大写字母了。不过要注意:这种写法对于非英文字母的Unicode大写字符(比如俄语、希腊语的大写字母)会失效,因为A-Z只覆盖ASCII的大写字母。如果你的场景只需要处理英文字母,这个写法超省心;如果要支持全Unicode大写,得把正则改成[^\\p{Lu}]\p{Lu}代表所有Unicode标准里的大写字母。

二、用Java 8+的Stream API实现函数式写法

如果团队习惯函数式编程风格,Stream API的写法会更优雅直观:

import java.util.Objects;

public static String getCapitalsOnly(String sentence) {
    if (Objects.isNull(sentence) || sentence.isEmpty()) {
        return "No message is given.";
    }
    String caps = sentence.chars()
            .filter(Character::isUpperCase)
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();
    return caps.isEmpty() ? "There are no capital letters in your message." : caps;
}

这种写法把字符串转成字符流,过滤出符合大写条件的字符,再收集成最终字符串,逻辑链很清晰。而且Character.isUpperCase是天然支持Unicode大写字符的,和你原代码的逻辑完全一致,不用额外调整。

三、原代码的细节优化(不换核心逻辑)

如果你偏爱原代码的底层循环风格,其实可以做几个小调整让代码更清爽:

import java.util.Objects;

public static String getCapitalsOnly(String sentence) {
    if (Objects.isNull(sentence) || sentence.isEmpty()) {
        return "No message is given.";
    }

    StringBuilder onlyCaps = new StringBuilder();
    // 用增强for循环替代下标循环,少了手动管理索引的麻烦
    for (char ch : sentence.toCharArray()) {
        if (Character.isUpperCase(ch)) {
            onlyCaps.append(ch);
        }
    }

    // 用三目运算符替代单独的if判断,减少代码嵌套
    return onlyCaps.isEmpty() 
        ? "There are no capital letters in your message." 
        : onlyCaps.toString();
}

这里把原来的下标循环改成增强for循环,少了手动维护i变量的代码,可读性更好;最后用三目运算符简化了空结果的判断逻辑,代码结构更紧凑。

最后聊聊各种写法的取舍

  • 原循环写法:性能最优,尤其是处理超长字符串时,底层循环的开销比Stream和正则都小,适合对性能敏感的场景
  • 正则写法:最简洁,但要注意Unicode支持的问题,适合快速实现或者明确只处理英文字母的场景
  • Stream写法:函数式风格,代码清晰易读,符合现代Java的开发趋势,团队如果用Java 8+的话,维护性会很好

总之没有绝对的“更好”,看你更看重代码简洁性、性能还是团队的代码风格统一啦!

火山引擎 最新活动