常用工具代码仓库

本文汇总了一系列实用的Java工具类,包括获取本机IP地址、Map转换为字符串、随机数生成、POJO基类设计等。同时介绍了如何计算金钱累加、判断字符串中是否包含中文字符、使用枚举类进行数据映射等技巧,并提供了响应通用JSON解析类的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

  1. 获取本机IP地址
  2. 将Map通过给定的连接符转成String
  3. 随机数生成工具类
  4. POJO基类设计
  5. .计算金钱的累加
  6. app版本升级
  7. 判断字符串中是否含有中文
  8. 字符串多字符匹配替换
  9. Enum遍历
  10. 响应通用Json解析类
  11. try处理IO关闭的新用法
  12. 通过api配置数据源
  13. 获取类和方法名
  14. 健壮性的进行数值型字符串的转换
  15. N–>1的映射
  16. 接口返回通用类
  17. 数据保留小数点

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值