代码的精简度,决定了代码的优美程度,易读性。虽然Java很难做到Python同样的代码量,但是善用一些小技巧还是对我们精简代码有所帮助。本文旨在记录一些小技巧。
都说Java生态好,很多通用工具无需我们自己造轮子,直接引入依赖调用即可,列举最常用的工具包:
Commons系列用于简化代码的常用工具包:
包 | 功能 |
---|---|
Codec | 处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等. |
Collections | java集合框架操作. |
IO | io工具的封装. |
Lang(Lang3) | Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等. |
阿里的Json工具包,极其方便的实现Json和Java对象的转换。
Spring作为Java开发的核心框架,里面也包含了很多好用的工具,最常用的两个:BeanUtils和CollectionUtils。
Setter类型的方法将当前对象返回去,如:
public User setNick(String nick) {
this.nick = nick;
return this;
}
将所有Setter均如此改造,构造用户“ID1,昵称张三,账号zhangsan,密码123456,状态1”:
User user = new User()
.setId(1)
.setNick("张三")
.setAccount("zhangsan")
.setPwd("123456")
.setState(1)
lombok可以通过注解代替繁琐的Getter,Setter,Constructor,equals,hashCode,toString等,让Java代码变得简洁。使用很简单,本文不详细介绍。
创建链式Setter方法的注解:@Accessors(chain = true),如User类使用lombok后代码如下:
@Data
@Accessors(chain = true)
@ToString
public class User {
private Integer id;
private String nick;
private String account;
private String pwd;
private Integer state;
private LocalDateTime createTime;
}
stream功能很强大,可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
stream常用功能:
从名字能看出来,filter就是用于筛选,例如:筛选出name不为空的用户代码如下:
userList = userList.stream().filter(u -> u.getNick() != null).collect(Collectors.toList());
使用map和Collectors可以轻松的完成类型转换和统计:
// 转Set
Set<User> userSet = userList.stream().collect(Collectors.toSet());
// 获取用户账号Set集合
Set<String> accountSet = userList.stream().map(User::getAccount).collect(Collectors.toSet());
// 转为以account为键的Map
Map<String,User> userMap = userList.stream().collect(Collectors.toMap(User::getAccount,u->u));
// 以state分组
Map<Integer,List<User>> userGroupMap = userList.stream().collect(Collectors.groupingBy(User::getState));
// 以state分组的account
Map<Integer,List<String>> userAccountGroupMap = userList.stream().collect(
Collectors.groupingBy(User::getState,Collectors.mapping(User::getAccount,Collectors.toList())));
// 统计状态为1的数量
userList.stream().filter(u -> Integer.valueOf(1).equals(u.getState())).count();
// 统计各状态数量
Map<Integer,Long> userCountMap = userList.stream().collect(Collectors.groupingBy(User::getState,Collectors.counting()));
使用链式调用,如需求:排除account为“admin”的,统计各状态数量的写法:
Map userCountMap = userList.stream()
.filter(u -> !"admin".equals(u.getAccount()))
.collect(Collectors.groupingBy(User::getState, Collectors.counting()));
EnumMap以枚举作为Key,有序且初始化长度合理,可以省略非必要的类定义且具有明确的Key。如下所示:
enum Region{
BJ,HB,HLJ
}
public Map<Region,Integer> compare(){
Map<Region,Integer> result = new EnumMap(Region.class);
result.put(Region.BJ,30);
result.put(Region.HB,20);
result.put(Region.HLJ,10);
return result;
}
interface中的属性默认为public static final,多级定义更显简洁;
/** 常量 */
public interface Const{
/** 状态 */
interface Status{
String SU = "SU";
String FA = "FA";
}
}