NumberOptional:一个字符串转数字的工具

在做Java开发中,我们经常会写下下面这样的代码:

try {int i = Integer.parseInt(s);
} catch (NumberFormatException e) {e.printStackTrace();
}

这段代码信息量只有一行,但是写起来就比较多了。每次都写就比较繁琐,如果不加try-catch又显得不严谨、不安全。于是,很多人选择封装一个数字操作相关的工具,比如各种各样的数字Util,操作的代码就变成了:

int i1 = NumberUtil.parseInt(s);//解析失败,默认返回0
int i2 = NumberUtil.parse(s, 0);//提供一个默认值,在解析失败的时候返回。
Optional<Integer> intOpt = NumberUtil.parseInt(s);//用Optional来表示解析失败为空的情况
//....

上面第一种方式不用说了,无法控制默认值使得在一些场景不适用;第二种方式,可以控制默认值,但是当值域为所有整数时,无法区分解析失败的情况。本文分享一个以前用来处理字符串转数字的工具。

使用示例

因为功能比较简单,所以直接上示例代码:

String s = "1";
String s2 = "2";
//1. getOr等重载根据提供的默认值类型来解析,如果不符合就返回提供的默认值
int i1 = NumberOptional.of(s).getOr(1);
float f1 = NumberOptional.of(s).getOr(1f);
//2. orGetXXX系列的方法用于处理默认值并非固定值,或者获取默认值的方法有些麻烦的情况。根据默认值的类型来解析字符串
int i2 = NumberOptional.of(s).orGetInt(() -> Config.getXXXDefault());
//3. xxxOr系列的方法用于从多个字符串取合适的值的情况,例如,如果s可用就用s的值,否则s2的值,如果s2的值还是不可用,就用默认值。
int i3 = NumberOptional.of(s).intOr(() -> NumberOptional.of(s2)).getOr(0);
//4. ifXXX的方法用于后面的操作仅在解析成功时执行的情况,如果失败则什么都不做
NumberOptional.of(s).ifInt(i -> {System.out.println("is Int:" + i);
});
//5. ifXXXOrElse系列的方法类似ifXXX,不过可以提供一个过程在解析失败的时候执行。
NumberOptional.of(s).ifIntOrElse(i -> {System.out.println("is int:" + i);
}, () -> {System.out.println("is not int");
});

parseOr

public class NumberOptional {private final String valueString;private NumberOptional() {this.valueString = null;}parseOrprivate NumberOptional(String valueString) {this.valueString = valueString;}public static NumberOptional of(String numberStr) {return new NumberOptional(numberStr);}public static NumberOptional of(Object object) {return new NumberOptional(String.valueOf(object));}public NumberOptional longOr(Supplier<? extends NumberOptional> supplier) {return parseOr(Long::parseLong, supplier);}public NumberOptional intOr(Supplier<? extends NumberOptional> supplier) {return parseOr(Integer::parseInt, supplier);}public NumberOptional floatOr(Supplier<? extends NumberOptional> supplier) {return parseOr(Float::parseFloat, supplier);}public NumberOptional doubleOr(Supplier<? extends NumberOptional> supplier) {return parseOr(Double::parseDouble, supplier);}public NumberOptional shortOr(Supplier<? extends NumberOptional> supplier) {return parseOr(Short::parseShort, supplier);}public NumberOptional byteOr(Supplier<? extends NumberOptional> supplier) {return parseOr(Byte::parseByte, supplier);}public long getOr(long defaultValue) {return parseOrElse(Long::parseLong, defaultValue);}public int getOr(int defaultValue) {return parseOrElse(Integer::parseInt, defaultValue);}public short getOr(short defaultValue) {return parseOrElse(Short::parseShort, defaultValue);}public byte getOr(byte defaultValue) {return parseOrElse(Byte::parseByte, defaultValue);}public float getOr(float defaultValue) {return parseOrElse(Float::parseFloat, defaultValue);}public double getOr(double defaultValue) {return parseOrElse(Double::parseDouble, defaultValue);}public long orGetLong(Supplier<Long> supplier) {return parseOrElseGet(Long::parseLong, supplier);}public int orGetInt(Supplier<Integer> supplier) {return parseOrElseGet(Integer::parseInt, supplier);}public short orGetShort(Supplier<Short> supplier) {return parseOrElseGet(Short::parseShort, supplier);}public byte orGetByte(Supplier<Byte> supplier) {return parseOrElseGet(Byte::parseByte, supplier);}public float orGetFloat(Supplier<Float> supplier) {return parseOrElseGet(Float::parseFloat, supplier);}public double orGetDouble(Supplier<Double> supplier) {return parseOrElseGet(Double::parseDouble, supplier);}public void ifLongOrElse(Consumer<Long> parsedConsumer, Runnable elseRunnable) {ifParseOrElse(Long::parseLong, parsedConsumer, elseRunnable);}public void ifIntOrElse(Consumer<Integer> parsedConsumer, Runnable elseRunnable) {ifParseOrElse(Integer::parseInt, parsedConsumer, elseRunnable);}public void ifShortOrElse(Consumer<Short> parsedConsumer, Runnable elseRunnable) {ifParseOrElse(Short::parseShort, parsedConsumer, elseRunnable);}public void ifByteOrElse(Consumer<Byte> parsedConsumer, Runnable elseRunnable) {ifParseOrElse(Byte::parseByte, parsedConsumer, elseRunnable);}public void ifFloatOrElse(Consumer<Float> parsedConsumer, Runnable elseRunnable) {ifParseOrElse(Float::parseFloat, parsedConsumer, elseRunnable);}public void ifDoubleOrElse(Consumer<Double> parsedConsumer, Runnable elseRunnable) {ifParseOrElse(Double::parseDouble, parsedConsumer, elseRunnable);}public void ifLong(Consumer<Long> parsedConsumer) {ifParse(Long::parseLong, parsedConsumer);}public void ifInt(Consumer<Integer> parsedConsumer) {ifParse(Integer::parseInt, parsedConsumer);}public void ifShort(Consumer<Short> parsedConsumer) {ifParse(Short::parseShort, parsedConsumer);}public void ifByte(Consumer<Byte> parsedConsumer) {ifParse(Byte::parseByte, parsedConsumer);}public void ifFloat(Consumer<Float> parsedConsumer) {ifParse(Float::parseFloat, parsedConsumer);}public void ifDouble(Consumer<Double> parsedConsumer) {ifParse(Double::parseDouble, parsedConsumer);}public String get() {return valueString;}private <T> T parseOrElseGet(Function<String, T> parser, Supplier<T> supplier) {try {return parser.apply(valueString);} catch (NumberFormatException | NullPointerException e) {return supplier.get();}}private <T> T parseOrElse(Function<String, T> parser, T defaultValue) {try {return parser.apply(valueString);} catch (NumberFormatException | NullPointerException e) {return defaultValue;}}private <T> NumberOptional parseOr(Function<String, T> parser, Supplier<? extends NumberOptional> supplier) {try {T i = parser.apply(valueString);return this;} catch (NumberFormatException | NullPointerException e) {return supplier.get();}}private <T> void ifParseOrElse(Function<String, T> parser, Consumer<T> parsedConsumer, Runnable elseRunnable) {final T i;try {i = parser.apply(valueString);} catch (NumberFormatException | NullPointerException e) {elseRunnable.run();return;}parsedConsumer.accept(i);}private <T> void ifParse(Function<String, T> parser, Consumer<T> parsedConsumer) {final T i;try {i = parser.apply(valueString);} catch (NumberFormatException | NullPointerException e) {return;}parsedConsumer.accept(i);}
}

NumberOptional:一个字符串转数字的工具相关推荐

  1. Java中怎么样检查一个字符串是不是数字呢

    问题:Java中怎么样检查一个字符串是不是数字呢 在解析之前,怎么样检查一个字符串是不是数字呢 回答一 这些通常是由一个简单的用户自定义函数去解决的(即,自带的 "isNumeric&quo ...

  2. 统计一个字符串中数字的个数

    问题描述 统计一个字符串中数字的个数 程序代码 #include <stdio.h> /* *csdn学院--2016级 *目的:让代码见证成长(作为一个初学的菜鸟,如 *大家有发现错误, ...

  3. java怎么一段字符串全为数字_java 如何判断一个字符串是数字

    断字符串是不是数字,大家可能会用一些java自带的方法,也有可能用其他怪异的招式,比如判断是不是整型数字,将字符串强制转换成整型,不是数字的就会抛出错误,那么就不是整型的了.但本文介绍的比较好的两种方 ...

  4. java 判断正负数_Java判断一个字符串为数字(正负、小数)

    这些天因为工作上的需求,其中一个小环节是传来一个String类型的参数,需要判断该参数是否为数字(正负.正数小数都要能判断). 当走到这个环节时,首先想到的是isDigit()方法,具体不清楚是哪个类 ...

  5. java数字转换32位字符串_java字符串和数字转换工具

    java数字和字符串之间的转换工具 class="java" name="code">package com.xwtec.util; /** * 数字工具 ...

  6. 设定关系(A=1,B=2,C=3,···,Z=26,AA=27,AB=28,···,AAA=XXX,···),写一个转换函数,根据上面规则把一个字符串转换为数字。

    这是一道进制转换问题,将10进制转换为26进制. ​#include<iostream> #include<string> using namespace std;int St ...

  7. OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数

    1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如 ...

  8. python输出字符串拼接数字_python实现字符串和数字拼接

    python实现字符串和数字拼接 如下所示: 将i前面加str(i)就可以了 补充拓展:python 连接字符串和数字 python 连接字符串和数字的问题: 首先要说的是,python是强类型的语言 ...

  9. java 判断数字_如何在java中判断一个字符串是否是数字

    前言 数字在某些领域经常用字符串来进行表示和传递.那么我们如何判断一个字符串是否是数字呢?今天我们来探讨一下这个话题. 空字符和null 首先我们可以很清晰的知道空字符""和nul ...

  10. 如何在java中判断一个字符串是否是数字

    前言 数字在某些领域经常用字符串来进行表示和传递.那么我们如何判断一个字符串是否是数字呢?今天我们来探讨一下这个话题. 空字符和null 首先我们可以很清晰的知道空字符""和nul ...

最新文章

  1. Java控制语句——for循环
  2. lol什么服务器出无限活力,《LOL》无限火力模式什么时候出 无限火力模式上线时间一览...
  3. MySQL批量插入数据的几种方法
  4. 树复制替换id_程序员的进阶课-架构师之路(12)-2-3-4树
  5. 隐藏SyntaxHighlighter滚动条
  6. 链表之单链表约瑟夫问题(一)
  7. python中unicode函数_中文字符 unicode转utf-8函数 python实现
  8. 基于不确定性量化的非精确概率可靠性理论
  9. 【人工翻译线代教材】Introduction to Linear Algebra BY Gilbert Strang【MIT】【线代】【翻译】
  10. Automated Installations of Multiple RHEL/CentOS 7 Distributions using PXE Server and Kickstart Files
  11. EduCoder-Web程序设计基础 -web编程训练-html5-文档头部-第2关:元信息的设置
  12. .输入一行字符串,含有数字和非数字字符以及空格等,如: df23adfd56 2343?23dgjop535 如果将其中所有连续出现的数字视为一个整数,要求统计在该字符串中共有多少个整数,并将这些数依
  13. 文字生成视频,清华出品
  14. 树莓派命令行下登录校园网
  15. jmeter参数化不起效果
  16. 湖南高职技能竞赛软件测试,湖南机电职院夺魁全国职业院校技能大赛软件测试赛项...
  17. Python高级变量类型(一)
  18. 倍加福PMI360D-F130-IE8-V15
  19. win10找不到wifi网络_手机搜索不到wifi网络,微信这样设置一下,走到哪里都能蹭网...
  20. android系统手机的基本知识和介绍

热门文章

  1. python控制手机模拟器_AppiumDesktop控制手机和安卓模拟器(附视频)
  2. Android Glide清除缓存图片 你可能不知道
  3. Python 根据身份证号判断所属省份,生日与性别
  4. 贴片钽电容封装及规格和参数资料
  5. 引入组件时的错误:Module not found: Error: Can‘t resolve ‘@/pages/Search‘
  6. 2022Java后端之美团笔试题
  7. Hibernate主键生成策略
  8. 一文彻底理解卡诺图化简算法
  9. 由java导入excel表格数据引发的一个惨案…(黑眼圈又重了,头发又白了)
  10. Cannot access a disposed object. A common cause of this error is disposing a context that ...问题解决