当前位置:网站首页>NumberOptional:一个字符串转数字的工具
NumberOptional:一个字符串转数字的工具
2022-07-24 02:33:00 【乐征skyline】
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;
}parseOr
private 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);
}
}
边栏推荐
- pbootcms模板调用标签序数从2开始或者自动数开始
- 关于 SAP Fiori 应用的离线使用
- 【FPGA教程案例39】通信案例9——基于FPGA的交织-解交织数据传输
- Tensorflow 2.0 deep learning tutorial
- C language curriculum - personal information management system (including student grades and consumption records)
- QT display Chinese garbled code
- 1000个Okaleido Tiger首发上线Binance NFT,引发抢购热潮
- [C language] preprocessing details
- Discussion on sending redundant API requests for Spartacus UI transfer state of SAP e-commerce cloud
- [Luogu] p1972 HH Necklace
猜你喜欢

redis数据类型概念
![[jailhouse article] virtualization over multiprocessor system on chip an enabling paradigm for](/img/7b/95df873bfcad6b14c009d2681cf2f6.png)
[jailhouse article] virtualization over multiprocessor system on chip an enabling paradigm for

MySQL---four JDBC
![[untitled]](/img/57/916e26018ddfa5ee1ef752fbbc3a4a.png)
[untitled]

TP5 framework link promotion project

Loadrunner12 installation, recording the first script and the proxy server did not respond to the solution

Leetcode 203. remove linked list elements (2022.07.22)

Idea's gradle project Chinese garbled

我国科学家在高安全量子密钥分发网络方面取得新进展

Use of component El scrollbar
随机推荐
Emmet syntax summary
pbootcms模板调用标签序数从2开始或者自动数开始
Performance test of ArrayList and LinkedList insertion based on jmh
Network protocol details: UDP
Qml- use listview to build a three-level treeview architecture
BPG笔记(三)
Camper recruitment | AI youth with the world in mind, the United Nations needs your help for sustainable development!
Maximize, minimize, restore, close and move the WinForm form form of C #
Wechat applet setting background image does not display problem solution
[knowledge atlas] practice -- Practice of question and answer system based on medical knowledge atlas (Part2): Atlas data preparation and import
MySQL---four JDBC
[diary of supplementary questions] [2022 Niuke summer school 1] d-mocha and railgun
No coding is required, and the "asynchronous request reply" mode is automatically implemented
Jina AI 联合Datawhale,发起学习项目!
Loadrunner12 installation, recording the first script and the proxy server did not respond to the solution
通用机环境下安全版单机数据库使用非root用户管理的解决方案
Crud operation of mongodb (2)
数据湖(十五):Spark与Iceberg整合写操作
餐饮连锁门店重塑增长背后的数字化转型
Responsive layout a web page displays different effects on different devices) meta:vp