同事老王记忆中还存的是JDK7的代码?再不帮帮他JDK15就出来了

447 阅读3分钟

随着2019年9月17日Java13正式发布,很多伙伴们都震惊了,手里用的还是个位数版本的,官方咋都干到13了,不过也不必太着急,毕竟最近的两个长期支持版本是8和11,手持Java8的伙伴表示还能再战三年!

但是身边的程序员老王虽然手持Java8,写的还是7的代码,记忆中几个经典的业务场景代码,已经烙印在脑海里了,其实大家早就不这么写了喂,让我们举几个例子:

  1. 老王记忆中的集合转为逗号拼接的字符串,是这样的
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
  1. 老王记忆中的显示创建一个线程,是这样的
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");
}
  1. 老王记忆中的使用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]
  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;
  1. 老王记忆中的获取明天的日期,是这样的
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”是怎样的,也是一门必修课程。