随着2019年9月17日Java13正式发布,很多伙伴们都震惊了,手里用的还是个位数版本的,官方咋都干到13了,不过也不必太着急,毕竟最近的两个长期支持版本是8和11,手持Java8的伙伴表示还能再战三年!
但是身边的程序员老王虽然手持Java8,写的还是7的代码,记忆中几个经典的业务场景代码,已经烙印在脑海里了,其实大家早就不这么写了喂,让我们举几个例子:
- 老王记忆中的集合转为逗号拼接的字符串,是这样的
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < bizList.size(); i++) {
strBuilder.append(bizList.get(i));
if (i != bizList.size() - 1) {
strBuilder.append(",");
}
}
System.out.println(strBuilder.toString());
// v,t,1,2,3,4
其实现在都是这样的
StringJoiner sj = new StringJoiner(",");
bizList.forEach(sj::add);
System.out.println(sj.toString());
// v,t,1,2,3,4
或者这样的
String result = bizList.stream().collect(Collectors.joining(","));
System.out.println(result);
// v,t,1,2,3,4
甚至直接这样的
String result = String.join(",", bizList);
System.out.println(result);
// v,t,1,2,3,4
- 老王记忆中的显示创建一个线程,是这样的
new Thread() {
@Override
public void run() {
System.out.println("New Thread");
}
}.start();
其实现在都是这样的:
Runnable task = () -> System.out.println("New Thread");
new Thread(task).start();
或者这样的:
public static void main(String[] args) {
new Thread(new CommonTest()::task).start();
}
public void task() {
System.out.println("New Thread");
}
- 老王记忆中的使用Map统计数组元素出现次数,是这样的
int[] intArr = {1, 5, 9, 6, 4, 5, 1, 5, 6, 9, 10, 1, 5};
Map<Integer, Integer> bizMap = new HashMap<>();
for (int i = 0; i < intArr.length; i++) {
int item = intArr[i];
// contains key : + 1
if (bizMap.containsKey(item)) {
bizMap.put(item, bizMap.get(item) + 1);
} else { // default 1
bizMap.put(item, 1);
}
}
for (Map.Entry<Integer, Integer> bizMapEntry : bizMap.entrySet()) {
System.out.print("[" + bizMapEntry.getKey() + " => " + bizMapEntry.getValue() + "]");
}
//[1 => 3][4 => 1][5 => 4][6 => 2][9 => 2][10 => 1]
其实现在都是这样的:
public static void main(String[] args) {
int[] intArr = {1, 5, 9, 6, 4, 5, 1, 5, 6, 9, 10, 1, 5};
Map<Integer, Integer> bizMap = new HashMap<>();
for (int i = 0; i < intArr.length; i++) {
bizMap.compute(intArr[i], CommonTest::count);
}
bizMap.forEach((k, v) -> System.out.print("[" + k + " => " + v + "]"));
//[1 => 3][4 => 1][5 => 4][6 => 2][9 => 2][10 => 1]
}
public static Integer count(Integer key, Integer val) {
return val == null ? 1 : val + 1;
}
甚至是这样的:
int[] intArr = {1, 5, 9, 6, 4, 5, 1, 5, 6, 9, 10, 1, 5};
// vt tips : 别忘了装箱boxed() 一下
Map<Integer, Integer> bizMap = Arrays.stream(intArr).boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(i -> 1)));
bizMap.forEach((k, v) -> System.out.print("[" + k + " => " + v + "]"));
//[1 => 3][4 => 1][5 => 4][6 => 2][9 => 2][10 => 1]
- 老王记忆中的对于嵌套对象的判空,是这样的
if (objA != null) {
ObjB objB = objA.getObjB();
if (objB != null) {
ObjC objC = objB.getObjC();
if (objC != null) {
return objC.getResult() == null ? "" : objC.getResult();
}
}
}
其实现在都是这样的:
String result = Optional.ofNullable(objA).map(ObjA::getObjB).map(ObjB::getObjC)
.map(ObjC::getResult).orElse(EMPTY);
return result;
- 老王记忆中的获取明天的日期,是这样的
Thread.sleep(24 * 60 * 60 * 1000);
Date result = new Date();
不是这段,老王记忆中是这样的:
Date currDate = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(currDate);
cal.add(Calendar.DATE, 1);
Date result = cal.getTime();
但是现在已经可以这样:
LocalDate result = LocalDate.now().plusDays(1);
java.util.Date utilsPackageDate = java.sql.Date.valueOf(result);
暂时先举这几个常用的例子,下面我们可以讨论一下,老王这样写代码,有错吗?
没有错,运行稳定,代码规范,就是好代码,就算你写出花了,别人看不懂,难以维护也是不可取的。
不过作为一名合格的程序员,时常更新一下技术储备,写下代码之前,思考一下要写的代码的“Best Practice”是怎样的,也是一门必修课程。