下边是整理的一些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));
-
String与八种基本类型(以int为例)
1 try { 2 int i = Integer.parseInt(str); 3 } catch (NumberFormatException e) { //str中可能有非数字 4 e.printStackTrace(); 5 }
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 }
三、随机数
- 使用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 }
- 当前日期和时间
- 时钟序列
- 全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
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
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);