惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
有赞技术团队
有赞技术团队
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
U
Unit 42
Hacker News - Newest:
Hacker News - Newest: "LLM"
V2EX - 技术
V2EX - 技术
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
H
Heimdal Security Blog
H
Hacker News: Front Page
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Cloudbric
Cloudbric
Google DeepMind News
Google DeepMind News
C
Cisco Blogs
The Cloudflare Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
MyScale Blog
MyScale Blog
F
Fortinet All Blogs
N
News | PayPal Newsroom
Attack and Defense Labs
Attack and Defense Labs
D
DataBreaches.Net
N
News and Events Feed by Topic
Security Archives - TechRepublic
Security Archives - TechRepublic
Forbes - Security
Forbes - Security
Simon Willison's Weblog
Simon Willison's Weblog
F
Full Disclosure
The Register - Security
The Register - Security
L
LINUX DO - 热门话题
Webroot Blog
Webroot Blog
Google Online Security Blog
Google Online Security Blog
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
K
Kaspersky official blog
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
T
Threatpost
Spread Privacy
Spread Privacy
小众软件
小众软件
AWS News Blog
AWS News Blog
S
Secure Thoughts
S
Security @ Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks

博客园 - buguge

最差实践(bad-practice):开发者在方法里直接实例化线程池对象,然后...(应用gg了) 【HttpClient最差实践(bad-practice)】开发者在 http 工具方法中直接实例化 HttpClient,然后…… Crypto、Cipher与Password:Java加密开发的三个核心概念 知识VS技能:如何优雅判空? 20260604SR超时问题排查 推敲见文章:从 `try..catch` 看异常日志打印的正确姿势 #解决问题要彻底# 慢SQL治理完成后,如何防止同类问题“死灰复燃”? 从合同甲方是荒谬的“JD”谈起:软件开发不应遗忘的“常识” 别留小尾巴/尽快剪掉小尾巴:从一次“ABA”字段重命名,谈谈“解决问题要彻底” 常见的OOM错误 ( OutOfMemoryError全类型详解) 开发者暴露了一个无需授权访问的裸接口,我问:如果有人暴力请求怎么办? 【SQL性能优化篇】有了!治理慢SQL“WHERE create_time ORDER BY id”的良药---规避“Using filesort”性能杀手 高效查询商户日终余额:一个SQL的优化实践 Hutool 的 `TimedCache` 到期会自动清理吗? ——————hutool cache的"惰性清理"和"定期清理" Fastjson枚举反序列化:当字符串不是枚举常量名时,会发生什么? fastjson-EnumDeserializer类及源码分析 `UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only` 异常解析 认识2个单词:goal/target —————— 为什么Maven是 "goal" 而不是 "target"? 聚合系统设计:策略模式(Strategy Pattern)在银行通道对接场景中的应用 这样构建对象,太帅了!—— 阶梯式Builder模式与代码整洁之道 注意!字段数据类型不匹配,这个sql会很慢 还在用ArrayList?用HashSet吧!--性能对比 分页查询还在用create_time去做降序? 从 synchronized 到 ConcurrentHashMap:一个小小的并发控制策略升级优化,证明我还是初级程序员 面试题沟通整理 【研发笔记20260120】值得记录:靠谱程序员的回聘 研发笔记:如何消除长字符串的秘钥数据对RPC负荷、日志量、系统安全所带来的伤害? 未给entity的主属性赋值,Mybatisplus却抛出了type mismatch异常。——————分享一下Mybatisplus主键填充机制 灵活用工平台-连续劳务所得税-计算器-工具类,拿走不谢 Apollo场景建议配置指南:充分发挥分布式配置中心优势
在java中实现c#的int.TryParse方法
buguge · 2025-12-09 · via 博客园 - buguge

先看一个思维训练题 - - - -> 一个西瓜进价 50 元,卖了 70 元,老板收了 100 元假币。 问:亏了多少钱?


↑ 上面小题与本文无关。↓ 如下是本文正文。

在.net(c#)的mscorlib程序集中,以System.Int32(int的实际类型)为例,有如下TryParse方法。

public static bool TryParse(string s, out int result)
{
    // 初始化输出参数为默认值
    result = 0;

    // 检查字符串是否为null或空
    if (string.IsNullOrEmpty(s))
    {
        return false; // 返回false,因为没有有效数据可以解析
    }

    // 尝试将字符串转换为整数
    try
    {
        result = Convert.ToInt32(s); // 或者使用int.Parse(s); 这将抛出异常如果转换失败
        return true; // 转换成功,返回true
    }
    catch (FormatException) // 或者 OverflowException, ArgumentOutOfRangeException 等异常
    {
        // 转换失败,返回false并保持result不变
        return false;
    }
    catch (OverflowException) // 对于超出int范围的情况
    {
        return false; // 返回false并保持result不变
    }
}

TryParse方法是一种安全、高效的类型转换方式。它不会在转换失败时抛出异常,而是返回一个布尔值来指示转换是否成功,并通过 out参数返回转换结果。

如下示例代码,显而易见,这个方法为我们做数据转换带来了极大便利。

string input = "12345";

// 声明变量用于接收转换结果
int number;

// 尝试转换并检查是否成功
if (int.TryParse(input, out number))
{
    Console.WriteLine($"转换成功!数字是: {number}");
}
else
{
    Console.WriteLine("转换失败,输入的不是有效整数");
}

那么,在java中,我们若实现类似的 TryParse 工具方法,应该如何实现呢?

在Java中实现类似C#的 int.TryParse方法,确实能带来更安全、更优雅的编码体验(指数字转换)。虽然Java没有原生的out参数,但我们可以通过一些技巧来达到相似的效果。

1. 返回包装对象(推荐)

这种方式利用Integer类可为null的特性,通过返回值直接传递转换结果:

public static Integer tryParse(String s) {
    if (s == null || s.trim().isEmpty()) {
        return null;
    }
    
    try {
        // 使用Integer.parseInt进行转换,并处理前导/后置空格
        return Integer.parseInt(s.trim());
    } catch (NumberFormatException e) {
        return null;
    }
}

方案优势

返回Integer对象的方式通常是最Java化的解决方案,因为它利用了Java的null安全特性,代码简洁易读。

2. 使用OptionalInt

使用OptionalInt是一个优雅且符合Java 8+风格的方式。OptionalInt是Java 8引入的用于处理可能不存在的int值的容器类。我们可以利用它来包装解析结果,避免返回null或抛出异常。

以下是一个使用OptionalInt实现的tryParse方法:

import java.util.OptionalInt;

public class IntTryParse {
    
    /**
     * 使用 OptionalInt 实现的安全字符串到整数的转换方法
     * 类似于 C# 的 int.TryParse 方法
     */
    public static OptionalInt tryParse(String s) {
        if (s == null || s.trim().isEmpty()) {
            return OptionalInt.empty(); // 返回空的 OptionalInt
        }
        
        try {
            int value = Integer.parseInt(s.trim());
            return OptionalInt.of(value); // 返回包含值的 OptionalInt
        } catch (NumberFormatException e) {
            return OptionalInt.empty(); // 转换失败时返回空的 OptionalInt
        }
    }
    
    /**
     * 提供默认值的重载版本
     */
    public static int tryParse(String s, int defaultValue) {
        return tryParse(s).orElse(defaultValue);
    }
}

使用示例:

点击查看代码
public static void main(String[] args) {
    // 测试有效输入
    OptionalInt result1 = IntTryParse.tryParse("1234");
    if (result1.isPresent()) {
        System.out.println("解析成功: " + result1.getAsInt());
    } else {
        System.out.println("解析失败");
    }

    // 测试无效输入
    OptionalInt result2 = IntTryParse.tryParse("abc");
    if (result2.isPresent()) {
        System.out.println("解析成功: " + result2.getAsInt());
    } else {
        System.out.println("解析失败");
    }

    // 使用函数式风格处理结果
    IntTryParse.tryParse("42").ifPresent(
        value -> System.out.println("解析到的值: " + value)
    );

    // 提供默认值
    int value = IntTryParse.tryParse("invalid").orElse(0);
    System.out.println("值(含默认): " + value);

    // 或者使用orElseGet提供默认值
    int value2 = IntTryParse.tryParse("invalid").orElseGet(() -> {
        System.out.println("提供默认值");
        return 100;
    });
    System.out.println("值(含默认): " + value2);

    // 或者解析失败时抛出自定义异常
    int value3 = IntTryParse.tryParse("invalid")
            .orElseThrow(() -> new IllegalArgumentException("无效的数字格式"));
    System.out.println("值: " + value3);
}

方案优势

使用 OptionalInt 的实现方案具有以下优势:

  1. 明确的语义OptionalInt 清晰地表达了"值可能存在"的语义,避免了 null 的歧义性。
    2.避免空指针异常:完全消除了返回 Integer 对象可能带来的空指针风险。
  2. 函数式编程支持:与 Java 8+ 的函数式特性完美集成,支持 ifPresentmapfilter 等操作。
  3. 代码简洁性:使用方法链可以让代码更加简洁和表达力强。
  4. 性能优化:相比于返回 Integer 对象,OptionalInt 对于原始类型有更好的性能表现。

注意事项

  • OptionalInt 本身不应该为 null,应该总是返回 OptionalInt.empty() 而不是 null
  • 在性能敏感的代码中,异常处理可能带来一些开销,但对于大多数应用场景来说是可以接受的。

这种基于 OptionalInt 的实现既安全又符合现代 Java 的编程风格,是处理字符串到整数转换的推荐方式。