1.1. 使用三元表达式
普通:
String title;
if (isMember(phone)) {
title = "会员";
} else {
title = "游客";
}
精简:
String title = isMember(phone) ? "会员" : "游客";
1.2. 利用 for-each 语句
从 Java 5 起,提供了 for-each 循环,简化了数组和集合的循环遍历。for-each 循环允许你无需保持传统 for 循环中的索引就可以遍历数组,或在使用迭代器时无需在 while 循环中调用 hasNext 方法和 next 方法就可以遍历集合。
普通:
double[] values = ...;
for(int i = 0; i < values.length; i++) {
double value = values[i];
// TODO: 处理 value
}
List<Double> valueList = ...;
Iterator<Double> iterator = valueList.iterator();
while (iterator.hasNext()) {
Double value = iterator.next();
// TODO: 处理 value
}
精简:
double[] values = ...;
for(double value : values) {
// TODO: 处理 value
}
List<Double> valueList = ...;
for(Double value : valueList) {
// TODO: 处理 value
}
1.3. 利用 try-with-resource 语句
所有实现 Closeable 接口的“资源”,均可采用 try-with-resource 进行简化。
普通:
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("cities.csv"));
String line;
while ((line = reader.readLine()) != null) {
// TODO: 处理 line
}
} catch (IOException e) {
log.error("读取文件异常", e);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
log.error("关闭文件异常", e);
}
}
}
精简:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
// TODO: 处理 line
}
} catch (IOException e) {
log.error("读取文件异常", e);
}
1.4. 利用 return 关键字
利用 return 关键字,可以提前函数返回,避免定义中间变量。
普通:
public static boolean hasSuper(@NonNull List<UserDO> userList) {
boolean hasSuper = false;
for (UserDO user : userList) {
if (Boolean.TRUE.equals(user.getIsSuper())) {
hasSuper = true;
break;
}
}
return hasSuper;
}
精简:
public static boolean hasSuper(@NonNull List<UserDO> userList) {
for (UserDO user : userList) {
if (Boolean.TRUE.equals(user.getIsSuper())) {
return true;
}
}
return false;
}
1.5. 利用 static 关键字
利用 static 关键字,可以把字段变成静态字段,也可以把函数变为静态函数,调用时就无需初始化类对象。
普通:
public final class GisHelper {
public double distance(double lng1, double lat1, double lng2, double lat2) {
// 方法实现代码
}
}
GisHelper gisHelper = new GisHelper();
double distance = gisHelper.distance(116.178692D, 39.967115D, 116.410778D, 39.899721D);
精简:
public final class GisHelper {
public static double distance(double lng1, double lat1, double lng2, double lat2) {
// 方法实现代码
}
}
double distance = GisHelper.distance(116.178692D, 39.967115D, 116.410778D, 39.899721D);
1.6. 利用 lambda 表达式
Java 8 发布以后,lambda 表达式大量替代匿名内部类的使用,在简化了代码的同时,更突出了原有匿名内部类中真正有用的那部分代码。
普通:
new Thread(new Runnable() {
public void run() {
// 线程处理代码
}
}).start();
精简:
new Thread(() -> {
// 线程处理代码
}).start();
1.7. 利用方法引用
方法引用(::),可以简化 lambda 表达式,省略变量声明和函数调用。
普通:
Arrays.sort(nameArray, (a, b) -> a.compareToIgnoreCase(b));
List<Long> userIdList = userList.stream()
.map(user -> user.getId())
.collect(Collectors.toList());
精简:
Arrays.sort(nameArray, String::compareToIgnoreCase);
List<Long> userIdList = userList.stream()
.map(UserDO::getId)
.collect(Collectors.toList());
1.8. 利用静态导入
静态导入(import static),当程序中大量使用同一静态常量和函数时,可以简化静态常量和函数的引用。
普通:
List<Double> areaList = radiusList.stream().map(r -> Math.PI * Math.pow(r, 2)).collect(Collectors.toList());...
精简:
import static java.lang.Math.PI;
import static java.lang.Math.pow;
import static java.util.stream.Collectors.toList;
List<Double> areaList = radiusList.stream().map(r -> PI * pow(r, 2)).collect(toList());...
注意:静态引入容易造成代码阅读困难,所以在实际项目中应该警慎使用。
1.9. 利用 unchecked 异常
Java 的异常分为两类:Checked 异常和 Unchecked 异常。Unchecked 异常继承了 RuntimeException,特点是代码不需要处理它们也能通过编译,所以它们称作 Unchecked 异常。利用 Unchecked 异常,可以避免不必要的 try-catch 和 throws 异常处理。
普通:
public class UserService {
public void createUser(UserCreateVO create, OpUserVO user) throws BusinessException {
checkOperatorUser(user);
...
}
private void checkOperatorUser(OpUserVO user) throws BusinessException {
if (!hasPermission(user)) {
throw new BusinessException("用户无操作权限");
}
...
}
...
}
"/user")
(public class UserController {
private UserService userService;
"/createUser")
( public Result<Void> createUser( UserCreateVO create,OpUserVO user) throws BusinessException {
userService.createUser(create, user);
return Result.success();
}
...
}
精简:
public class UserService {
public void createUser(UserCreateVO create, OpUserVO user) {
checkOperatorUser(user);
...
}
private void checkOperatorUser(OpUserVO user) {
if (!hasPermission(user)) {
throw new BusinessRuntimeException("用户无操作权限");
}
...
}
...
}
"/user")
(public class UserController {
private UserService userService;
"/createUser")
( public Result<Void> createUser( UserCreateVO create, OpUserVO user) {
userService.createUser(create, user);
return Result.success();
}
...
}
正文完