如何把代码写的优雅之实践

小弟从毕业到现在参加工作半年多了,在review同事的代码学习到了很多优雅的地方,在此做记录,持续更新。

欢迎大家向我提出意见,若有错误的地方还请大家多多指出

一、Lambda表达式

准备例子:

@Data
Class Person{
 private String code;
 private String name;
 private int age;
 private Date birthday;
}

 

需求1:

我们需要对Person进行频繁的读取操作,为了减少数据库的io操作,决定把Person集合一次性取出到内存中,构建id->Obj的map结构,方便从内存中快速读取,减少与数据库的交互。

不优雅的写法:

private Map<Integer,Person> geneId2PersonMap(){
    List<Person> personList = personDao.selectAll();
    Map<String,Person> id2PersonMap = new HashMap();
    for(Person p:personList){
        String code = person.getCode();
        id2PersonMap.put(code,Person);
    }
    return id2PersonMap;
}

思路:由于这里需要对list对map的转换,可以尝试用lambda表达式。

优雅的写法:

private Map<String,Person> geneId2PersonMap(){
    List<Person> personList = personDao.selectAll();
    return personList.stream().
             collect(Collectors.
             toMap(Person::getCode,Function.identity(),(k1,k2)->k2)); 
}

注意:这里toMap中,第一个参数为key,第二个参数为value,其中还有第三个可选参数为如果参数重复的话选用的规则,上述规则是如果有两个Person的code相同,在进行map构建的时候后一个Person将会覆盖前一个Person。

需求2

现有一个Person的集合,我们想取出年龄大于18岁的集合

不优雅的写法

private List<Person> getGt18AgeList(List personList){
    List<Person> res = new ArrayList();
    for(Person p : personList){
        if(p.getAge() > 18){
           res.add(p);
        }
    }
    return res
}

这时候可以考虑使用lambda的过滤器

private List<Person> getGt18AgeList(List personList){
    return personList.stream()
        .filter(p->p.getAge()>18).collect(Collectors.toList())
}

 

需求3

我们这里有一个Person的集合,现在我们需要通过Person集合取到code的集合

不优雅的写法:

private List<String> getCodeList(List personList){
    List<String> codeList = new ArrayList();
    for(Person p : personList){
        codeList.add(p.getCode);
    }
    return codeList;
}

优雅写法:

private List<String> getCodeList(List personList){
    return personList.stream().map(Person::getCode).collect(Collectors.toList());
}

这里主要用到了map这个函数,可以了解一下

 

二、循环操作

准备例子:

class Country{
    String name;
    List<Province> provinceList;
}

Class Province{
    String name;
    List<City> city;
}
Class City{
    String name;
}

需求1:

输出country为中国的浙江省的所有城市:

不优雅的写法

private void printCity(List countries){
    for(Country country : countries){
        if("中国".equals(country.getName()){
            List<Province> provinceList = country.getProvince;
            for(Province province:provinceList){
                if("浙江".equals(province.getName()){
                     List<City> cityList = province.getCity;   
                     for(City city : cityList){
                        System.out.printline(city.getName());
                    }      
                }
            }
        }
    }
}

有此可以看出代码层级非常之多,我们可以通过非操作来减少代码层级

优雅的写法:

private void printCity(List countries){
    for(Country country : countries){
        if(!"中国".equals(country.getName()){
            continue;              
        }
        List<Province> provinceList = country.getProvince;
        for(Province province:provinceList){
            if(!"浙江".equals(province.getName()){
                continue;      
            }
           List<City> cityList = province.getCity;   
           for(City city : cityList){
               System.out.printline(city.getName());
            } 
        }
    }
}

可以明显的看出,虽然代码量没有变化,但是层级明显减少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值