目录:
- 获取本机IP地址
- 将Map通过给定的连接符转成String
- 随机数生成工具类
- POJO基类设计
- .计算金钱的累加
- app版本升级
- 判断字符串中是否含有中文
- 字符串多字符匹配替换
- Enum遍历
- 响应通用Json解析类
- try处理IO关闭的新用法
- 通过api配置数据源
- 获取类和方法名
- 健壮性的进行数值型字符串的转换
- N–>1的映射
- 接口返回通用类
- 数据保留小数点
1.获取本机IP地址
public static String getIpAddress() {
Enumeration allNetInterfaces = null;
String ipv4Ip = null;
try {
allNetInterfaces = NetworkInterface.getNetworkInterfaces();
} catch (java.net.SocketException e) {
e.printStackTrace();
}
InetAddress ip = null;
while (allNetInterfaces.hasMoreElements()) {
NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
Enumeration addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
ip = (InetAddress) addresses.nextElement();
if (ip != null && ip instanceof Inet4Address) {
if (ip.getHostAddress().equals("127.0.0.1")) {
continue;
}
ipv4Ip = ip.getHostAddress();
}
}
}
return ipv4Ip;
}
2.将Map通过给定的连接符转成String
private static final String MAP_KV_CONNECTOR = "=";//key-vlaue连接符
private static final String MAP_ENTRY_CONNECTOR = "&";//Entry间连接符
public static String convertMapToString(final Map<String, String> data) {
if (data.size() == 0) {
return "";
}
StringBuilder strBuilder = new StringBuilder();
data.forEach((key, value) -> { strBuilder.append(key).append(MAP_KV_CONNECTOR).append(value).append(MAP_ENTRY_CONNECTOR);
});
strBuilder.deleteCharAt(strBuilder.length() - 1);
return strBuilder.toString();
}
package com.h.test;
import com.google.common.base.Joiner;
import com.google.common.collect.Maps;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by John on 2018/5/5.
*/
public class TestMain {
public static void main(String[] args) {
Map<String,Object> map = Maps.newHashMap();
map.put("a",123);
map.put("b",456);
map.put("c",789);
/**
* 将Map组装成如key1=value1&key2=value2...格式
*/
//1.传统的编程方式
StringBuilder sb = new StringBuilder();
for (Map.Entry entry:map.entrySet()){
sb.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
String s = sb.deleteCharAt(sb.length() - 1).toString();
System.out.println(s);//a=123&b=456&c=789
//2.使用Guava工具
String join = Joiner.on("&").withKeyValueSeparator("=").join(map);
System.out.println(join);
//3.使用Java8 Lambda表达式
String collect = map.entrySet().stream()
.map(
entry -> {
StringBuilder sb2 = new StringBuilder();
return sb2.append(entry.getKey())
.append("=")
.append(entry.getValue()).toString();
}
)
.collect(Collectors.joining("&"));
System.out.println(collect);
}
}
3.随机数生成工具类
import java.util.concurrent.ThreadLocalRandom;
/**
* Created by John on 2018/4/6.
*/
public class RandomUtil {
public static final int ASCII_0 = 48;
public static final int ASCII_9 = 57;
public static final int ASCII_9_BOUND = ASCII_9 + 1;
/**
* <br>产生一个随机的纯数字字符串</br>
*/
public static String randomNum(int length) {
StringBuilder builder = new StringBuilder(length);
for (int i = 0; i < length; i++) {
builder.append((char) (ThreadLocalRandom.current().nextInt(ASCII_0, ASCII_9_BOUND)));
}
return builder.toString();
}
}
4.POJO基类设计
import java.io.Serializable;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 字符串toString基类
*/
public class ToStringBase implements Serializable {
/** 序列号ID */
private static final long serialVersionUID = 1704932592395633947L;
/**
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}
5.计算金钱的累加
BigDecimal sum = new BigDecimal(0);
for (Bill bill : billList) {
sum = sum.add(bill.getRepayAmount());
}
6.app版本升级
import org.apache.commons.lang3.math.NumberUtils;
/**
* 是否大于或等于某个版本
* @param oldVersion
* @return
*/
public static boolean isNewVersion(String oldVersion) {
String version = getVersion();
if (StringUtils.isNotBlank(version) && version.trim().length() >= 3) {
version = version.trim().replace(".", "");
oldVersion = oldVersion.trim().replace(".", "");
if (NumberUtils.toDouble(version, 0) >= NumberUtils.toDouble(oldVersion, 0)) {
return true;
}
}
return false;
}
7.判断字符串中是否含有中文
public static boolean isContainsChinese(String str) {
String regEx = "[\u4e00-\u9fa5]";
Pattern pat = Pattern.compile(regEx);
Matcher matcher = pat.matcher(str);
boolean flg = false;
if (matcher.find()) {
flg = true;
}
return flg;
}
8.字符串多字符匹配替换
String secretStr = paramLinkedStr + PASSWORD_BIRD_KEY + todayStr;
secretStr = secretStr.replaceAll(";|,| |-|:", "");
9.Enum遍历
public static SerializeEnum acquire(final String serialize) {
Optional<SerializeEnum> serializeEnum =
Arrays.stream(SerializeEnum.values())
.filter(v -> Objects.equals(v.getSerialize(), serialize))
.findFirst();
return serializeEnum.orElse(SerializeEnum.KRYO);
}
10.响应通用Json解析类
package com.h.util;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.Iterator;
/**
* json解析工具
*/
public class JsonStrParser {
/**
* 将给定的json字符串转换为通用的响应类
* @param jsonResp
* @return
*/
public static ResponseNode toResponseNode(String jsonResp) {
ResponseNode respNode = null;
if (StringUtils.isNotEmpty(jsonResp)) {
respNode = new ResponseNode();
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode rootNode = mapper.readTree(jsonResp);
Iterator<String> keys = rootNode.fieldNames();
String fieldName = null;
while (keys.hasNext()) {
fieldName = keys.next();
JsonNode jsonNode = rootNode.get(fieldName);
String s = jsonNode.asText();
if ("status".equalsIgnoreCase(fieldName)) {
respNode.setStatus(s);
} else if ("message".equalsIgnoreCase(fieldName)) {
respNode.setMessage(s);
} else if ("data".equalsIgnoreCase(fieldName)) {
// 不同接口返回的data字段类型可能不确定, 所以不用toString(); 保持数据的原本类型
respNode.setData(jsonNode);
} else if ("code".equalsIgnoreCase(fieldName)) {
respNode.setCode(s);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
return respNode;
}
private static class ResponseNode {
private String status;
private String message;
private Object data;
private String code;
getter/setter()...
@Override
public String toString() {
return "ResponseNode{" +
"status='" + status + '\'' +
", message='" + message + '\'' +
", data=" + data +
", code='" + code + '\'' +
'}';
}
}
public static void main(String[] args) {
String str = "{\"code\":\"0\",\"data\":[{\"contractNo\":13199642002,\"id\":5498414,\"creditAmount\":14300},{\"contractNo\":13199642001,\"id\":3307498,\"creditAmount\":3300}],\"message\":\"获取结清证明合同成功\",\"result\":\"success\"}";
ResponseNode responseNode = toResponseNode(str);
System.out.println(responseNode);
}
}
Maven依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
11.try处理IO关闭的新用法
//1.传统用法
FileWriter fw = null;
try {
fw = new FileWriter("E://demo.txt");
fw.flush();
fw.write("JavaIO练习xxxxx");
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fw != null){
fw.close();
}
}
//2.JDK1.7后的用法
try (FileWriter fw = new FileWriter("E://demo.txt")) {
fw.write("JavaIO练习");
} catch (IOException e) {
e.printStackTrace();
}
/**
*在try()中加的话是临时变量,过后就被回收了,在{}虽然执行完了,理论上也会被回收,但是会很慢。。。
*输出流在在关闭的时候会自动flush(),当然,你可以手动调用此方法。
*因为Java 7 改写了所有的IO资源类,它们都实现了 AutoCloseable接口,因此都可以通过自动关闭资源的try 语句来关闭这些IO 流。这就是try块自动关闭IO流的写法
*/
12.通过api配置数据源
spring:
masterdb:
driver-class-name: oracle.jdbc.driver.OracleDriver
api: http://idcapp19:17000/api/Config/GetConnectionString?key=2s9BIf7hav3NvZ5vd3fPRAdwMO2GqhZM0PAwvgYP5l0=
filters: stat
initialSize: 2
maxActive: 300
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: false
maxPoolPreparedStatementPerConnectionSize: 200
13.获取类和方法名
package com.h.test;
/**
* Created by John on 2018/5/5.
*/
public class TestMain {
public static void main(String[] args) {
StackTraceElement stackElement = new Throwable().getStackTrace()[0];
String key = stackElement.getClassName() + "#" + stackElement.getMethodName();
System.out.println(key);//com.h.test.TestMain#main
}
}
14.健壮性的进行数值型字符串的转换
String ss = "null";
/**
* 对于String ss = "null";
* 以下两种转换都会报java.lang.NumberFormatException: For input string: "null"
* Integer.valueOf(ss);
* Integer.parseInt(ss);
*/
//如何健壮性的进行数值型字符串的转换
if (org.apache.commons.lang3.math.NumberUtils.isNumber(ss)){ //可以排除"null",null,"",非数值型String
System.out.println(NumberUtils.createInteger(ss));
}
15. N–>1的映射
/**
* Map<String,List<Object>>可以实现1->N的映射,
* 那么如何实现N->1的映射呢?
* 比如在支付场景中根据不同的支付方式设置相应的回调地址?
*/
/**
* 传统的做法 switch
* @param payType
* @return
*/
public static String getPayReturnAndNotifyUrl(String payType){
String res = "";
switch (payType){
case "ALIPAY_WAP":
case "ALIPAY_APP":
case "ALIPAY_WEB":
res = "ALIPAY_URL";
break;
case "WECHAT_APP":
case "WECHAT_JSAPI":
res = "WECHAT_URL";
break;
case "JDPAY_WAP":
res = "JD_URL";
break;
default:
res = "NOTIFY_URL";
}
return res;
}
public static String getPayReturnAndNotifyUrl2(String payType){
Map<String,String> urlMap = new HashMap<>(3);
urlMap.put("ALIPAY","ALIPAY_URL");
urlMap.put("WECHAT","WECHAT_URL");
urlMap.put("JD","JD_URL");
Map<String,String> payMap = new HashMap<>(6);
payMap.put("ALIPAY_WAP","ALIPAY");
payMap.put("ALIPAY_APP","ALIPAY");
payMap.put("ALIPAY_WEB","ALIPAY");
payMap.put("WECHAT_APP","WECHAT");
payMap.put("WECHAT_JSAPI","WECHAT");
payMap.put("JDPAY_WAP","JD");
return Optional.ofNullable(urlMap.get(payMap.get(payType))).orElse("defaultUrl");
}
//================================================================
import java.util.Arrays;
import java.util.Objects;
/**
* Created by John on 2018/11/10.
*/
public enum NotifyUrlEnum {
ALIPAY_WAP("ALIPAY_WAP","ALIPAY_URL"),
ALIPAY_APP("ALIPAY_APP","ALIPAY_URL"),
ALIPAY_WEB("ALIPAY_WEB","ALIPAY_URL"),
WECHAT_APP(" WECHAT_APP","WECHAT_URL"),
WECHAT_JSAPI("WECHAT_JSAPI","WECHAT_URL"),
JDPAY_WAP("JDPAY_WAP","JD_URL"),
DEFAULT_URL("DEFAULT_URL","defaultUrl");
private String code;
private String url;
NotifyUrlEnum(String code, String url) {
this.code = code;
this.url = url;
}
public static NotifyUrlEnum acquire(String code){
return Arrays.stream(NotifyUrlEnum.values())
.filter(v -> Objects.equals(v.getCode(),code))
.findFirst().orElse(DEFAULT_URL);
}
public String getCode() {
return code;
}
public String getUrl() {
return url;
}
}
16.接口返回通用类
public class Result {
public static final int SUCCESS_CODE = 0;
public static final String ERROR_MSG = "fail";
private int code; // 状态码
private String message; // 说明信息
private String result; // result结果,快速判断
private Object data; // 结果数据
public Result() {
this(SUCCESS_CODE, "成功","success",null);
}
public Result(int code, String msg) {
this(code, msg, ERROR_MSG, null);
}
public Result(Object data) {
this(SUCCESS_CODE, "成功", "success", data);
}
public Result(int code, String message, String result, T data) {
this.code = code;
this.message = message;
this.result = result;
this.data=data;
}
getter/setter()...
@Override
public String toString() {
return "Result [code=" + code + ", message=" + message + ", result=" + result + ", data=" + data + "]";
}
}
public class DataResult<T>{
public static final int SUCCESS_CODE = 0;
public static final String ERROR_MSG = "fail";
private int code; // 状态码
private String message; // 说明信息
private String result; // result结果,快速判断
private T data; // 结果数据
public Result() {
this(SUCCESS_CODE, "成功","success",null);
}
public Result(int code, String msg) {
this(code, msg, ERROR_MSG, null);
}
public Result(T data) {
this(SUCCESS_CODE, "成功", "success", data);
}
public Result(int code, String message, String result, T data) {
this.code = code;
this.message = message;
this.result = result;
this.data=data;
}
getter/setter()...
@Override
public String toString() {
return "Result [code=" + code + ", message=" + message + ", result=" + result + ", data=" + data + "]";
}
}
17.数据保留小数点
public static Double getScaleValue(Double d, int scale, double divisor) {
double v = d / divisor;
String s = String.valueOf(v);
String res = s;
StringBuilder format;
if (res.contains(".")) {
int i = s.indexOf(".");
int n = s.length();
String s0 = s.substring(0, i);
String s1 = s.substring(i + 1, n);
int l = s1.length();
if (l >= scale) {
s1 = s1.substring(0, scale);
} else {
for (int k = 0; k < (scale - l); k++) {
s1 += "0";
}
}
res = s0 + "." + s1;
} else {
format = new StringBuilder("#.");
for (int j = 0; j < scale; j++) {
format.append("0");
}
DecimalFormat decimalFormat = new DecimalFormat(format.toString());
res = decimalFormat.format(res);
}
return Double.parseDouble(res);
}