小弟从毕业到现在参加工作半年多了,在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());
}
}
}
}
可以明显的看出,虽然代码量没有变化,但是层级明显减少。