工具篇-Java中一些utils

下边是整理的一些Java开发的utils,顺便吐槽下新浪博客的编辑器排版跟我写的博客一样 烂,所以改用博客园

一、字符串

1. Java中String与其他类型之间的转换

  • String与日期对象 

1 public static SimpleDateFormat df1 = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
2 public static SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
3 df2.format(df1.parse(time_local));
在将字符串转为日期对象时,可以使用parse方法;日期对象转为字符串时,可以使用format方法。但是parse在解析日期字符串的时候本身存在一些问题:比如https://blog.csdn.net/a158123/article/details/54292268
  • String与八种基本类型(以int为例)

String转int:
1 try {
2     int i = Integer.parseInt(str);
3 } catch (NumberFormatException e) { //str中可能有非数字
4     e.printStackTrace();
5 }
int转String:
第一种方法:
  1 str=i+""; //会产生两个String对象 
第二种方法:
  1 str=String.valueOf(i); //直接使用String类的静态方法,只产生一个String对象 

2. 去掉字符串前面的0

  • 使用replaceAll(正则,要替换上的字符串)
1 String str = "000000001234034120";
2 String newStr = str.replaceAll("^(0+)", "");
3 System.out.println(newStr);

这里说明下replace和replaceAll的区别:replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换;replaceAll的参数是regex,即基于正则表达式的替换。

  • 使用replaceFirst(正则,要替换上的字符串)
1 String str = "000000001234034120";
2 String newStr = str.replaceFirst("^(0+)", "");
3 System.out.println(newStr);

3. String.format方法

1 String formatted = String.format("%s今年%d岁。", "我", 25); // 打印结果:"我今年25岁。"
第一个参数是格式串,后面参数都是格式串的参数,用于替换格式串中的占位符。占位符类型有下面几种:(大写表示输出为大写)

 

二、Spring

1. JSONField 注解

  • 指定字段的名称

1 @JSONField(name="role_name")    
2 private String roleName;  
  • 使用format制定日期格式

public class A {    
     // 配置date序列化和反序列使用yyyyMMdd日期格式    
     @JSONField(format="yyyyMMdd")    
     public Date date;    
}   
  • 指定字段的顺序

1 public static class VO {    
2    @JSONField(ordinal = 3)    
3    private int f0;    
4     
5    @JSONField(ordinal = 2)    
6    private int f1;    
7     
8    @JSONField(ordinal = 1)    
9    private int f2;    
  • 使用serialize/deserialize指定字段不序列化

1 public class A {  
2       @JSONField(serialize=false)  
3       public Date date;  
4  }  

三、随机数

1. Java中产生随机数的方法
  • 使用Random类

Random类可以产生 boolean、int、long、float, byte 数组以及 double 类型的随机数,这是它与 random()方法最大的不同之处,random()方法只能产生double类型的 0~1的随机数。
Random 类位于 java.util 包中,该类常用的有如下两个构造方法。
Random():该构造方法使用一个和当前系统时间对应的数字作为种子数,然后使用这个种子数构造 Random 对象。
Random(long seed):使用单个 long 类型的参数创建一个新的随机数生成器。例如:

 1 public static void main(String[] args)
 2 {
 3         Random r=new Random();
 4         double d1=r.nextDouble();    //生成[0,1.0]区间的小数
 5         double d2=r.nextDouble()*7;    //生成[0,7.0]区间的小数
 6         int i1=r.nextInt(10);    //生成[0,10]区间的整数
 7         int i2=r.nextInt(18)-3;    //生成[-3,15]区间的整数
 8         long l1=r.nextLong();    //生成一个随机长整型值
 9         boolean b1=r.nextBoolean();    //生成一个随机布尔型值True或者False
10         float f1=r.nextFloat{);    //生成一个随机浮点型值
11 }
  • Math类的random()方法

该方法没有参数,它默认会返回大于等于0.0、小于1.0的double类型随机数。如下:

1 public static void main(String[] args)
2 {
3         int min=0;    //定义随机数的最小值
4         int max=100;    //定义随机数的最大值
5         //产生一个1~100的数
6         int s=(int)min+(int)(Math.random()*(max-min));
7 }
2. Java生成UUID
UUID 的目的是让分布式系统中所有元素都有唯一辨识资讯,而不需要由中央控制端来做辨识资讯的指定。
UUID由以下几部分的组成:
  • 当前日期和时间
  • 时钟序列
  • 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
      UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。
UUID 来作为数据库数据表主键是非常不错的选择,保证每次生成的UUID 是唯一的。
 1      //获得指定数目的UUID
 2     public static String[] getUUID(int number){
 3         if(number < 1){
 4             return null;
 5         }
 6         String[] retArray = new String[number];
 7         for(int i=0;i){
 8             retArray[i] = getUUID();
 9         }
10         return retArray;
11     }
12        //获得一个UUID
13     public static String getUUID(){
14         String uuid = UUID.randomUUID().toString();
15         //去掉“-”符号 
16         return uuid.replaceAll("-", "");
17     }

四、文件

1. FileUtils

具有封装的读写文件、复制文件等功能。例如:

1 import org.apache.commons.io.FileUtils;
2 List lines = new ArrayList();
3 ...
4 FileUtils.writeLines(new File("/Users/admin/1.txt"), lines, true);
5 String result = FileUtils.readFileToString(new File("/Users/admin/1.txt"), "UTF-8");

2. 配置文件读取 

一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,maven能把这些资源文件打包到相应的jar或者war里。在程序中就可以直接读取了,例如:
  • properties文件

1 InputStream input =Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties"); 
2 Properties prop = new Properties();
3 prop.load(input);
  • yaml文件

1 InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(yamlPath);
2 Yaml yaml = new Yaml();
3 HashMap map = yaml.loadAs(inputStream, HashMap.class);

五、Java反射

1. 反射取私有方法

  • 在调用私有方法时必须用getDeclaredMethod,getDeclaredMethod和getMethod区别如下:

getMethod:Returns a object that reflects the specified public member method of the class or interface represented by this object.(只能获取public的方法

getDeclaredMethod:Returns a object that reflects the specified declared method of the class or interface represented by this object. (能获取类中所有方法

  • 调用私有方法时除了在调用之前需要设置setAccessible(true)

六、网络

1. 主机名转IP

1 String ip = InetAddress.getByName(hostName).getHostAddress();

七、缓存

1. Guava Cache

注:通过RemovalNotification.getCause()可以知道该对象被移除的原因
 1 public enum RemovalCause {
 2   //用户手动移除
 3   EXPLICIT,
 4   //用户手动替换
 5   REPLACED,
 6   //被垃圾回收
 7   COLLECTED,
 8   //超时过期
 9   EXPIRED,
10   //由于缓存大小限制
11   SIZE;
12 }

八、日期

1. TimeUnit

TimeUnit提供了各种时间方法,比如常用的toMillis、toNaNos、sleep(Long timeout)等等,可读性极高,使用方便且性能也不错,具体使用方法参考:Java-TimeUnit类常用方法详解,对比一下:

1 // TimeUnit
2 TimeUnit.MILLISECONDS.sleep(10);
3 TimeUnit.SECONDS.sleep(10);
4 TimeUnit.MINUTES.sleep(10);
5 
6 // 原生Thread方法
7 Thread.sleep(10);
8 Thread.sleep(10*1000);
9 Thread.sleep(10*60*1000); 

九、代码规范

1. 减少if/else书写(一般嵌套不超过三层为好)

  • 提前return
1 if (condition) {
2     // do something
3 } else {
4     return xxx;
5 }

这种情况条件取反,干掉else

1 if (!condition) {
2   return xxx;  
3 }
4 
5 // do something
  • 策略模式

有种情况是根据不同的参数走不同的逻辑,先看一般写法:

1 if (strategy.equals("fast")) {
2     // 快速执行
3 } else if ("strategy.equals("normal")) {
4     // 正常执行
5 } else if ("strategy.equals("smooth")) {
6     // 平滑执行
7 } else if ("strategy.equals("slow"))  {
8     // 慢慢执行
9 }

其实可以用枚举

 1 public enum Stategy {
 2   FAST{
 3     @Override
 4     public void run() {
 5       System.out.println("fast---");
 6     }
 7   },
 8   NORMAL{
 9     @Override
10     public void run() {
11       System.out.println("normal---");
12     }
13   },
14   SMOOTH{
15     @Override
16     public void run() {
17       System.out.println("smooth---");
18     }
19   },
20   SLOW {
21     @Override
22     public void run() {
23       System.out.println("slow---");
24     }
25   };
26 
27   public abstract void run();
28 }

最后,可以通过param执行不同逻辑

1 Strategy strategy = Strategy.valueOf(param);
2 Strategy.run();
  • 用Optional
 jdk8新特性,主要用于非空判断
1 if (user == null) {
2     // do action 1
3 } else {
4     // do action2
5 }

可以改为

1 Optional<User> userOptional =  Optional.ofNullable(user);
2 userOptional.map(action1).orElse(action2);

 

 

转载于:https://www.cnblogs.com/lcmichelle/p/10742615.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值