Java精简代码小技巧(不定时更新)

代码的精简度,决定了代码的优美程度,易读性。虽然Java很难做到Python同样的代码量,但是善用一些小技巧还是对我们精简代码有所帮助。本文旨在记录一些小技巧。

1. 工具包

都说Java生态好,很多通用工具无需我们自己造轮子,直接引入依赖调用即可,列举最常用的工具包:

Apache Commons系列

Commons系列用于简化代码的常用工具包:

功能
Codec处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等.
Collectionsjava集合框架操作.
IOio工具的封装.
Lang(Lang3)Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.

FastJson工具包

阿里的Json工具包,极其方便的实现Json和Java对象的转换。

Spring工具

Spring作为Java开发的核心框架,里面也包含了很多好用的工具,最常用的两个:BeanUtils和CollectionUtils。

2. 巧用链式调用

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)

3. lombok

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;
}

4. 巧用stream

stream功能很强大,可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

stream常用功能:

4.1. filter[过滤]

从名字能看出来,filter就是用于筛选,例如:筛选出name不为空的用户代码如下:

userList = userList.stream().filter(u -> u.getNick() != null).collect(Collectors.toList());

4.2. map[映射] Collectors[聚合]

使用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<Integer, Long> userCountMap = userList.stream()
    .filter(u -> !"admin".equals(u.getAccount()))
    .collect(Collectors.groupingBy(User::getState, Collectors.counting()));

5. 巧用EnumMap

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;
}

6.使用interface存储常量

interface中的属性默认为public static final,多级定义更显简洁;

/** 常量 */
public interface Const{    
    /** 状态 */    
    interface Status{        
        String SU = "SU";        
        String FA = "FA";    
    }
}

7.使用DateFormat校验日期格式

放行2023-05-06而不允许放行2023-5-1时,可举一反三,比增加一个正则清爽多了。

public static boolean isValidDate(String date) {  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
        sdf.setLenient(false);  
        try {  
            Date result = sdf.parse(date);  
            return date.equals(sdf.format(result));  
        } catch (ParseException e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值