JAVA代码优化

代码优化方式有很多,本文记录几个优化小技巧,会持续更新,欢迎关注~

  • List Stream 流相关操作

 public static void main(String[] args) {
        User user1 = new User(1, "张三", 20);
        User user2 = new User(2, "李四", 21);
        User user3 = new User(3, "王武", 22);
        User user4 = new User(4, "老六", 23);
        User user5 = new User(5, "小七", 24);
        User user6 = new User(6, "大八", 25);

        List<User> userList = new ArrayList<>(7);
        userList.add(user1);
        userList.add(user2);
        userList.add(user5);
        userList.add(user6);
        userList.add(user6);
        userList.add(user3);
        userList.add(user4);

		//转换Map结构
		Map<Integer, String> roleMap = userList.stream().collect(Collectors.toMap(User::getId, User::getName));

		//转换Map<id,entity>结构
		Map<Integer, User> collect = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

		//获取list的id集合,未去重的
		List<Integer> idList = userList.stream().map(User::getId).collect(Collectors.toList());
		
		//获取list的id集合,去重的
		List<Integer> idList = userList.stream().map(User::getId).distinct().collect(Collectors.toList());
	
        //list转成map,注意key重复情况下只会有一个值。可以在多层循环中使用
        Map<Integer, List<User>> collect = userList.stream().collect(Collectors.groupingBy(User::getId));

        //filter:根据条件过滤流中的某些元素
        List<User> userFilter = userList.stream().filter(user -> user.getName().equals("老六")).collect(Collectors.toList());

        //limit(n):获取n个元素
        List<User> userLimit = userList.stream().filter(user -> user.getName().equals("大八")).limit(1).collect(Collectors.toList());

        //skip(n):跳过n元素,配合limit(n)可实现分页
        List<User> userSkip = userList.stream().skip(2).limit(3).collect(Collectors.toList());

        //distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素
        List<User> userDistinct = userList.stream().distinct().collect(Collectors.toList());

        //流操作排序:按照id正序,由小到大
        List<User> userSort_1 = userList.stream().sorted((o1, o2) -> o1.getId().compareTo(o2.getId())).collect(Collectors.toList());
        List<User> userSort_2 = userList.stream().sorted(Comparator.comparing(User::getId)).collect(Collectors.toList());

        //流操作排序:按照id倒序,由大到小
        List<User> userSort_3 = userList.stream().sorted((o1, o2) -> o2.getId().compareTo(o1.getId())).collect(Collectors.toList());
        List<User> userSort_4 = userList.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());

        //流操作:按照id排序,如果id相同按照名称排序
        List<User> userSort2 = userList.stream().sorted((o1, o2) -> {
            if (0 != o1.getId().compareTo(o2.getId())) {
                return o1.getId().compareTo(o2.getId());
            } else {
                return o1.getName().compareTo(o2.getName());
            }
        }).collect(Collectors.toList());

        //List接口排序:按照id正序,改变原list顺序,不生成新的对象List
        userList.sort(Comparator.comparing(User -> User.getId()));

        //获取id中最大,最小,总数
        LongSummaryStatistics intSummaryStatistics = userList.stream().mapToLong(User::getId).summaryStatistics();
        System.out.println(intSummaryStatistics.getMin());
        System.out.println(intSummaryStatistics.getMax());
        System.out.println(intSummaryStatistics.getCount());
    }
  • String.format字符串拼接

以前常用方式:

String url = "https://www.baidu.com/s?ie=" + ieVal + "&f=" + fVal;

后来使用StringBuffer方式:

StringBuffer stringBufferURL = new StringBuffer("https://www.baidu.com/s?");
stringBufferURL.append("ie=")
        .append(ieVal)
        .append("&f=")
        .append(fVal);

优化后使用String.format(不建议在循环体中使用):

String url = "https://www.baidu.com/s?ie=%s&f=%s";
String.format(url, ieVal, fVal);
  • 循环体内勿重复创建对象

优化前:

for (int i = 1; i <= count; i++){
    Object obj = new Object();    
}

优化后:

Object obj = null;
for (int i = 0; i <= count; i++){
    obj = new Object();
}
  • if else 判断优化

建议if else判断不超过三层

1、使用枚举类

public enum EnterpriseTypeEnum {
	Industry(0,0,"工业"),
	Business(1,1,"商业"),
	Hospital(2,2,"医院");
	
	private Integer mainType;
	private Integer subType;
	private String typeName;
}

2、使用switch
jdk1.7以后switch支持String类型

String a="你好";
switch (a){
    case "你好":
        System.out.println("你好");
        break;
    case "不好":
        System.out.println("不好");
        break;
}

3、判空时,可使用三目运算符或Optional函数

//三目运算
String val = "demo";
System.out.println(null == val  ? "" : val)

//Optional函数
Optional<String> strOptional = Optional.of(val);
strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));
  • count查询优化

优化前:

SQL写法:
SELECT count(*) FROM table WHERE id = 1 AND status = 0;

Java写法:
int nums = xxDao.countXxxxByXxx(params);
if ( nums > 0 ) {
  //当存在时,执行这里的代码
} else {
  //当不存在时,执行这里的代码
}

优化思路:SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了,业务代码中直接判断是否非空即可
优化后:

SQL写法:
SELECT 1 FROM table WHERE id = 1 AND status = 0 LIMIT 1;

Java写法:
Integer exist = xxDao.existXxxxByXxx(params);
if ( exist != NULL ) {
  //当存在时,执行这里的代码
} else {
  //当不存在时,执行这里的代码
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值