Photo
PriscillaDuPreez文
常意
前言古语有云:
道为术之灵,术为道之体;以道统术,以术得道。其中:“道”指“规律、道理、理论”,“术”指“方法、技巧、技术”。意思是:“道”是“术”的灵*,“术”是“道”的肉体;可以用“道”来统管“术”,也可以从“术”中获得“道”。在拜读大佬“孤尽”的文章《CodeReview是苦涩但有意思的修行》时,感受最深的一句话就是:“优质的代码一定是少即是多的精兵原则”,这就是大佬的代码精简之“道”。工匠追求“术”到极致,其实就是在寻“道”,且离悟“道”也就不远了,亦或是已经得道,这就是“工匠精神”——一种追求“以术得道”的精神。如果一个工匠只满足于“术”,不能追求“术”到极致去悟“道”,那只是一个靠“术”养家糊口的工匠而已。作者根据多年来的实践探索,总结了大量的Java代码精简之“术”,试图阐述出心中的Java代码精简之“道”。1.利用语法1.1.利用三元表达式普通:Stringtitle;if(isMember(phone)){title="会员";}else{title="游客";}精简:
Stringtitle=isMember(phone)?"会员":"游客";注意:对于包装类型的算术计算,需要注意避免拆包时的空指针问题。1.2.利用for-each语句从Java5起,提供了for-each循环,简化了数组和集合的循环遍历。for-each循环允许你无需保持传统for循环中的索引就可以遍历数组,或在使用迭代器时无需在while循环中调用hasNext方法和next方法就可以遍历集合。普通:
double[]values=...;for(inti=0;ivalues.length;i++){doublevalue=values;//TODO:处理value}ListDoublevalueList=...;IteratorDoubleiterator=valueList.iterator();while(iterator.hasNext()){Doublevalue=iterator.next();//TODO:处理value}精简:
double[]values=...;for(doublevalue:values){//TODO:处理value}ListDoublevalueList=...;for(Doublevalue:valueList){//TODO:处理value}1.3.利用try-with-resource语句所有实现Closeable接口的“资源”,均可采用try-with-resource进行简化。普通:
BufferedReaderreader=null;try{reader=newBufferedReader(newFileReader("cities.csv"));Stringline;while((line=reader.readLine())!=null){//TODO:处理line}}catch(IOExceptione){log.error("读取文件异常",e);}finally{if(reader!=null){try{reader.close();}catch(IOExceptione){log.error("关闭文件异常",e);}}}精简:
try(BufferedReaderreader=newBufferedReader(newFileReader("test.txt"))){Stringline;while((line=reader.readLine())!=null){//TODO:处理line}}catch(IOExceptione){log.error("读取文件异常",e);}1.4.利用return关键字利用return关键字,可以提前函数返回,避免定义中间变量。普通:
publicstaticbooleanhasSuper(
NonNullListUserDOuserList){booleanhasSuper=false;for(UserDOuser:userList){if(Boolean.TRUE.equals(user.getIsSuper())){hasSuper=true;break;}}returnhasSuper;}精简:publicstaticbooleanhasSuper(
NonNullListUserDOuserList){for(UserDOuser:userList){if(Boolean.TRUE.equals(user.getIsSuper())){returntrue;}}returnfalse;}1.5.利用static关键字利用static关键字,可以把字段变成静态字段,也可以把函数变为静态函数,调用时就无需初始化类对象。普通:publicfinalclassGisHelper{publicdoubledistance(doublelng1,doublelat1,doublelng2,doublelat2){//方法实现代码}}GisHelpergisHelper=newGisHelper();doubledistance=gisHelper.distance(.D,39.D,.D,39.D);精简:
publicfinalclassGisHelper{publicstaticdoubledistance(doublelng1,doublelat1,doublelng2,doublelat2){//方法实现代码}}doubledistance=GisHelper.distance(.D,39.D,.D,39.D);1.6.利用lambda表达式Java8发布以后,lambda表达式大量替代匿名内部类的使用,在简化了代码的同时,更突出了原有匿名内部类中真正有用的那部分代码。普通:
newThread(newRunnable(){publicvoidrun(){//线程处理代码}}).start();精简:
newThread(()-{//线程处理代码}).start();1.7.利用方法引用方法引用(::),可以简化lambda表达式,省略变量声明和函数调用。普通:
Arrays.sort(nameArray,(a,b)-a.