银河思科学习小组 加入小组

24个成员 461713个话题 创建时间:2015-03-11

庄河私人借钱-今日一版

发表于2023-08-14 11次查看

庄河私人借钱-今日一版【vx---ys1912ys--】

俗话说得好

道的精神,道的身体 有了道教,你就可以用你的技能得到道。

其中,“道”是指“法、理、论”,“术”是指“法、术、术”。含义 道是艺术的灵魂,艺术是道的本体 道可以用来控制操作,道可以从操作中获得。

在看《绝望》第《CodeReview是苦涩但有意思的修行》篇的时候,感受最深的一句话 “高质量的代码一定是少即是多的原则”,这是大榭的代码简化之“道”。

普通

字符串标题

ifisMemberphone{

Title='Member

}否则{

Title='游客'

}精简

Stringtitle=isMember?会员‘3360’游客

注意 对于包类型的算术计算,需要避免拆包时空指针的问题。

从Java5开始,提供了foreach循环,简化了数组和集合的循环遍历。Foreach循环允许在传统For循环中不保留索引的情况下遍历数组,或者在使用迭代器时在while循环中不调用hasNext方法和Next方法的情况下遍历集合。

普通

双精度值=.

forintI=0 I值.长度 i{

doublevalue=values[I]

TODO:处理值

}

列表值列表=.

迭代器iterator=valueList.iterator

whileiterator.hasNext{

Doublevalue=iterator.next

TODO:处理值

}精简

双精度值=.

fordoublevalue:值{

TODO:处理值

}

列表值列表=.

forDoublevalue:valuelist{

TODO:处理值

}1.3.使用trywithresource语句。所有实现可关闭接口的“资源”都可以通过使用trywithresource语句来简化。

普通

bufferedreaderreader=

尝试{

reader=newbufferedreadernewfilereader'cities.CSV'

弦线

whileline=reader.readLine!={

TODO3360处理行

}

}catchIOExceptione{

Log.error'读取文件时出现异常',e

}最后{

如果读者!={

尝试{

读者.关闭

}catchIOExceptione{

Log.error'文件关闭异常',e

}

}

}精简

trybufferedreaderreader=newbufferedreadernewfilereader'test.txt'{

弦线

whileline=reader.readLine!={

TODO3360处理行

}

}catchIOExceptione{

Log.error'读取文件时出现异常',e

}1.4.使用return关键字使用return关键字,可以提前返回函数,避免定义中间变量。

普通

普通

公共最终类GisHelper{

公共双距离双lng1、双lat1、双lng2、双lat2{

方法实现代码

}

}

GisHelpergisHelper=新GIShelper

doubledistance=GIShelper.distance116.d,39.D,116.D,39.d 精简

公共最终类GisHelper{

公共静态双距离双lng1,双lat1,双lng2,doublelat2{方法实现代码}}doubledistance=GisHelper.distance116.D,39.D,116.D,39.D;1.6.利用lambda表达式Java8发布以后,lambda表达式大量替代匿名内部类的使用,在简化了代码的同时,更突出了原有匿名内部类中真正有用的那部分代码。

普通

newThreadnewRunnable{publicvoidrun{线程处理代码}}.start;精简

newThread>{线程处理代码}.start;1.7.利用方法引用方法引用::,可以简化lambda表达式,省略变量声明和函数调用。

普通

Arrays.sortnameArray,a,b>apareToIgnoreCaseb;ListuserIdList=userList.stream.mapuser>user.getId.collectCollectors.toList;精简 Arrays.sortnameArray,String::compareToIgnoreCase;ListuserIdList=userList.stream.mapUserDO::getId.collectCollectors.toList;1.8.利用静态导入静态导入importstatic,当程序中大量使用同一静态常量和函数时,可以简化静态常量和函数的引用。

普通

ListareaList=radiusList.stream.mapr>Math.PI Math.powr,2.collectCollectors.toList;...

精简

importstaticjava.lang.Math.PI;importstaticjava.lang.Math.pow;importstaticjava.util.stream.Collectors.toList;ListareaList=radiusList.stream.mapr>PI powr,2.collecttoList;...注意 静态引入容易造成代码阅读困难,所以在实际项目中应该警慎使用。

Java的异常分为两类 Checked异常和Unchecked异常。Unchecked异常继承了RuntimeException,特点是代码不需要处理它们也能通过编译,所以它们称作Unchecked异常。利用Unchecked异常,可以避免不必要的trycatch和throws异常处理。

普通

Lombok提供了一组有用的注解,可以用来消除Java类中的大量样板代码。

普通

publicclassUserVO{privateLongid;privateStringname;publicLonggetId{returnthis.id;}publicvoidsetIdLongid{this.id=id;}publicStringgetName{returnthis.name;}publicvoidsetNameStringname{this.name=name;}...}精简

普通

1、当注解属性值跟默认值一致时,可以删除该属性赋值

2、当注解只有value属性时,可以去掉value进行简写

3、当注解属性组合等于另一个特定注解时,直接采用该特定注解。

普通

在Java没有引入泛型前,都是采用Object表示通用对象,最大的问题就是类型无法强校验并且需要强制类型转换。

普通

publicstaticMapnewHashMapString[]keys,Integer[]values{检查参数非空ifArrayUtils.isEmptykeys||ArrayUtils.isEmptyvalues{returnCollections.emptyMap;}转化哈希映射Mapmap=newHashMap<>;intlength=Math.minkeys.length,values.length;forinti=0;imap.putkeys[i],values[i];}returnmap;}...精简

publicstaticMapnewHashMapK[]keys,V[]values{检查参数非空ifArrayUtils.isEmptykeys||ArrayUtils.isEmptyvalues{returnCollections.emptyMap;}转化哈希映射Mapmap=newHashMap<>;intlength=Math.minkeys.length,values.length;forinti=0;imap.putkeys[i],values[i];}returnmap;}...利用自身方法4.1.利用构造方法

构造方法,可以简化对象的初始化和设置属性操作。对于属性字段较少的类,可以自定义构造方法。

普通

利用Set的add方法的返回值,可以直接知道该值是否已经存在,可以避免调用contains方法判断存在。

普通

以下案例是进行用户去重转化操作,需要先调用contains方法判断存在,后调用add方法进行添加。

SetuserIdSet=newHashSet<>;ListuserVOList=newArrayList<>;forUserDOuserDO:userDOList{if!userIdSet.containsuserDO.getId{userIdSet.adduserDO.getId;userVOList.addtransUseruserDO;}}精简

SetuserIdSet=newHashSet<>;ListuserVOList=newArrayList<>;forUserDOuserDO:userDOList{ifuserIdSet.adduserDO.getId{userVOList.addtransUseruserDO;}}4.3.利用Map的computeIfAbsent方法利用Map的computeIfAbsent方法,可以保证获取到的对象非空,从而避免了不必要的空判断和重新设置值。

普通

Map>roleUserMap=newHashMap<>;forUserDOuserDO:userDOList{LongroleId=userDO.getRoleId;ListuserList=roleUserMap.getroleId;ifObjects.isuserList{userList=newArrayList<>;roleUserMap.putroleId,userList;}userList.adduserDO;}精简

Map>roleUserMap=newHashMap<>;forUserDOuserDO:userDOList{roleUserMapputeIfAbsentuserDO.getRoleId,key>newArrayList<>.adduserDO;}4.4.利用链式编程链式编程,也叫级联式编程,调用对象的函数时返回一个this对象指向对象本身,达到链式效果,可以级联调用。链式编程的优点是 编程性强、可读性强、代码简洁。

普通

StringBuilderbuilder=newStringBuilder96;builder.append"selectid,namefrom";builder.appendT_USER;builder.append"whereid=";builder.appenduserId;builder.append";";精简

StringBuilderbuilder=newStringBuilder96;builder.append"selectid,namefrom".appendT_USER.append"whereid=".appenduserId.append";";利用工具方法5.1.避免空值判断

普通

ifuserList!=&&!userList.isEmpty{TODO:处理代码}精简

ifCollectionUtils.isNotEmptyuserList{TODO:处理代码}5.2.避免条件判断普通

doubleresult;ifvalueresult=MIN_LIMIT;}else{result=value;}精简

doubleresult=Math.maxMIN_LIMIT,value;5.3.简化赋值语句普通

publicstaticfinalListANIMAL_LIST;static{ListanimalList=newArrayList<>;animalList.add"dog";animalList.add"cat";animalList.add"tiger";ANIMAL_LIST=Collections.unmodifiableListanimalList;}精简

JDK流派publicstaticfinalListANIMAL_LIST=Arrays.asList"dog","cat","tiger";Guava流派publicstaticfinalListANIMAL_LIST=ImmutableList.of"dog","cat","tiger";注意 Arrays.asList返回的List并不是ArrayList,不支持add等变更操作。

普通

UserVOuserVO=newUserVO;userVO.setIduserDO.getId;userVO.setNameuserDO.getName;...userVO.setDescriptionuserDO.getDescription;userVOList.adduserVO;精简

UserVOuserVO=newUserVO;BeanUtils.copyPropertiesuserDO,userVO;userVOList.adduserVO;反例

ListuserVOList=JSON.parseArrayJSON.toJSONStringuserDOList,UserVO.class;

精简代码,但不能以过大的性能损失为代价。例子是浅层拷贝,用不着JSON这样重量级的武器。

5.5.简化异常断言

普通

ifObjects.isuserId{thrownewIllegalArgumentException"用户标识不能为空";}精简

Assert.notuserId,"用户标识不能为空";

注意 可能有些插件不认同这种判断,导致使用该对象时会有空指针警告。

把测试用例数据以JSON格式存入文件中,通过JSON的parseObject和parseArray方法解析成对象。虽然执行效率上有所下降,但可以减少大量的赋值语句,从而精简了测试代码。

普通

一些常规算法,已有现成的工具方法,我们就没有必要自己实现了。

普通

inttotalSize=valueList.size;List>partitionList=newArrayList<>;forinti=0;ipartitionList.addvalueList.subListi,Math.miniPARTITION_SIZE,totalSize;}精简

List>partitionList=ListUtils.partitionvalueList,PARTITION_SIZE;

5.8.封装工具方法

一些特殊算法,没有现成的工具方法,我们就只好自己亲自实现了。

普通

比如,SQL设置参数值的方法就比较难用,setLong方法不能设置参数值为。

设置参数值ifObjects.nonuser.getId{statement.setLong1,user.getId;}else{statement.set1,Types.BIGINT;}...精简

我们可以封装为一个工具类SqlHelper,简化设置参数值的代码。

SQL辅助类 publicfinalclassSqlHelper{ 设置长整数值 publicstaticvoidsetLongPreparedStatementstatement,int,LongvaluethrowsSQLException{ifObjects.nonvalue{statement.setLong,value.longValue;}else{statement.set,Types.BIGINT;}}...}设置参数值SqlHelper.setLongstatement,1,user.getId;利用数据结构6.1.利用数组简化

对于固定上下限范围的ifelse语句,可以用数组循环来简化。

普通

publicstaticintgetGradedoublescore{ifscore>=90.0D{return1;}ifscore>=80.0D{return2;}ifscore>=60.0D{return3;}ifscore>=30.0D{return4;}return5;}精简

privatestaticfinaldoubleSCORE_RANGES=newdouble{90.0D,80.0D,60.0D,30.0D};publicstaticintgetGradedoublescore{forinti=0;iifscore>=SCORE_RANGES[i]{returni1;}}returnSCORE_RANGES.length1;}思考 上面的案例返回值是递增的,所以用数组简化是没有问题的。但是,如果返回值不是递增的,能否用数组进行简化呢?答案是可以的,请自行思考解决。

对于映射关系的ifelse语句,可以用Map来简化。此外,此规则同样适用于简化映射关系的switch语句。

普通

publicstaticStringgetBiologyClassStringname{switchname{case"dog":return"animal";case"cat":return"animal";case"lavender":return"plant";...default:return;}}精简 privatestaticfinalMapBIOLOGY_CLASS_MAP=ImmutableMap.builder.put"dog","animal".put"cat","animal".put"lavender","plant"....build;publicstaticStringgetBiologyClassStringname{returnBIOLOGY_CLASS_MAP.getname;}已经把方法简化为一行代码,其实都没有封装方法的必要了。

Java不像Python和Go,方法不支持返回多个对象。如果需要返回多个对象,就必须自定义类,或者利用容器类。常见的容器类有Apache的Pair类和Triple类,Pair类支持返回2个对象,Triple类支持返回3个对象。

普通

publicstaticPairgetNearestPointpoint,Point[]points{计算最近点和距离...返回最近点和距离returnImmutablePair.ofnearestPoint,nearestDistance;}6.4.利用ThreadLocal简化ThreadLocal提供了线程专有对象,可以在整个线程生命周期中随时取用,极大地方便了一些逻辑的实现。用ThreadLocal保存线程上下文对象,可以避免不必要的参数传递。

普通

由于DateFormat的format方法线程非安全建议使用替代方法,在线程中频繁初始化DateFormat性能太低,如果考虑重用只能用参数传入DateFormat。例子如下

publicstaticStringformatDateDatedate,DateFormatformat{returnformat.formatdate;}publicstaticListgetDateListDateminDate,DatemaxDate,DateFormatformat{ListdateList=newArrayList<>;Calendarcalendar=Calendar.getInstance;calendar.setTimeminDate;StringcurrDate=formatDatecalendar.getTime,format;StringmaxsDate=formatDatemaxDate,format;whilecurrDatepareTomaxsDatedateList.addcurrDate;calendar.addCalendar.DATE,1;currDate=formatDatecalendar.getTime,format;}returndateList;}精简 可能你会觉得以下的代码量反而多了,如果调用工具方法的地方比较多,就可以省下一大堆DateFormat初始化和传入参数的代码。

利用Optional

在Java8里,引入了一个Optional类,该类是一个可以为的容器对象。

普通

IntegerthisValue;ifObjects.nonvalue{thisValue=value;}else{thisValue=DEFAULT_VALUE;}精简

IntegerthisValue=Optional.ofablevalue.orElseDEFAULT_VALUE;

普通

IntegerthisValue;ifObjects.nonvalue&&valuepareToMAX_VALUEthisValue=value;}else{thisValue=MAX_VALUE;}精简 IntegerthisValue=Optional.ofablevalue.filtertempValue>tempValuepareToMAX_VALUE7.3.避免空判断普通

Stringzipcode=;ifObjects.nonuser{Addressaddress=user.getAddress;ifObjects.nonaddress{Countrycountry=address.getCountry;ifObjects.noncountry{zipcode=country.getZipcode;}}}精简 Stringzipcode=Optional.ofableuser.mapUser::getAddress.mapAddress::getCountry.mapCountry::getZipcode.orElse;利用Stream流Stream是Java8的新成员,允许你以声明式处理数据集合,可以看成为一个遍历数据集的高级迭代器。流主要有三部分构成 获取一个数据源→数据转换→执行操作获取想要的结果。每次转换原有Stream对象不改变,返回一个新的Stream对象,这就允许对其操作可以像链条一样排列,形成了一个管道。流Stream提供的功能非常有用,主要包括匹配、过滤、汇总、转化、分组、分组汇总等功能。

普通

booleanisFound=false;forUserDOuser:userList{ifObjects.equalsuser.getId,userId{isFound=true;break;}}精简 booleanisFound=userList.stream.anyMatchuser>Objects.equalsuser.getId,userId;8.2.过滤集合数据普通

ListresultList=newArrayList<>;forUserDOuser:userList{ifBoolean.TRUE.equalsuser.getIsSuper{resultList.adduser;}}精简 ListresultList=userList.stream.filteruser>Boolean.TRUE.equalsuser.getIsSuper.collectCollectors.toList;8.3.汇总集合数据普通

doubletotal=0.0D;forAccountaccount:accountList{total=account.getBalance;}精简 doubletotal=accountList.stream.mapToDoubleAccount::getBalance.sum;

8.4.转化集合数据普通

ListuserVOList=newArrayList<>;forUserDOuserDO:userDOList{userVOList.addtransUseruserDO;}精简 ListuserVOList=userDOList.stream.mapthis::transUser.collectCollectors.toList;8.5.分组集合数据普通

8.7.生成范围集合Python的range非常方便,Stream也提供了类似的方法。

普通

intarray1=newint[N];forinti=0;iarray1[i]=i1;}intarray2=newint[N];array2[0]=1;forinti=1;iarray2[i]=array2[i1] 2;}精简 intarray1=IntStream.rangeClosed1,N.toArray;intarray2=IntStream.iterate1,n>n 2.limitN.toArray;利用程序结构9.1.返回条件表达式条件表达式判断返回布尔值,条件表达式本身就是结果。

普通

publicbooleanisSuperLonguserIdUserDOuser=userDAO.getuserId;ifObjects.nonuser&&Boolean.TRUE.equalsuser.getIsSuper{returntrue;}returnfalse;}精简 publicbooleanisSuperLonguserIdUserDOuser=userDAO.getuserId;returnObjects.nonuser&&Boolean.TRUE.equalsuser.getIsSuper;}9.2.最小化条件作用域最小化条件作用域,尽量提出公共处理代码。

普通

Resultresult=summaryService.reportWorkDailyworkDaily;ifresult.isSuccess{Stringmessage="上报工作日报成功";dingtalkService.sendMessageuser.getPhone,message;}else{Stringmessage="上报工作日报失败:"result.getMessage;log.warnmessage;dingtalkService.sendMessageuser.getPhone,message;}精简 Stringmessage;Resultresult=summaryService.reportWorkDailyworkDaily;ifresult.isSuccess{message="上报工作日报成功";}else{message="上报工作日报失败:"result.getMessage;log.warnmessage;}dingtalkService.sendMessageuser.getPhone,message;9.3.调整表达式位置调整表达式位置,在逻辑不变的前提下,让代码变得更简洁。

普通1

Stringline=readLine;whileObjects.nonline{...处理逻辑代码line=readLine;}普通2 forStringline=readLine;Objects.nonline;line=readLine{...处理逻辑代码}精简 Stringline;whileObjects.nonline=readLine{...处理逻辑代码}注意 有些规范可能不建议这种精简写法。

在比较对象时,交换对象位置,利用非空对象,可以避免空指针判断。

普通

privatestaticfinalintMAX_VALUE=1000;booleanisMax=value!=&&value.equalsMAX_VALUE;booleanisTrue=result!=&&result.equalsBoolean.TRUE;精简

privatestaticfinalIntegerMAX_VALUE=1000;booleanisMax=MAX_VALUE.equalsvalue;booleanisTrue=Boolean.TRUE.equalsresult;利用设计模式10.1.模板方法模式

模板方法模式TemplateMethodPattern定义一个固定的算法框架,而将算法的一些步骤放到子类中实现,使得子类可以在不改变算法框架的情况下重定义该算法的某些步骤。

普通

普通

publiclongexecuteFetchStringtableName,intbatchSize,FunctiondataParser,Function,Boolean>dataStoragethrowsException{构建下载会话DownloadSessionsession=buildSessiontableName;获取数据数量longrecordCount=session.getRecordCount;ifrecordCount==0{return0;}进行数据读取longfetchCount=0L;tryRecordReaderreader=session.openRecordReader0L,recordCount,true{依次读取数据Recordrecord;ListdataList=newArrayList<>batchSize;whilerecord=reader.read!={解析添加数据Tdata=dataParser.applyrecord;ifObjects.nondata{dataList.adddata;}批量存储数据ifdataList.size==batchSize{BooleanisContinue=dataStorage.applydataList;fetchCount=batchSize;dataList.clear;if!Boolean.TRUE.equalsisContinue{break;}}}存储剩余数据ifCollectionUtils.isNotEmptydataList{dataStorage.applydataList;fetchCount=dataList.size;dataList.clear;}}返回获取数量returnfetchCount;}使用案例longfetchCount=odpsService.executeFetch"user",5000,record>{UserDOuser=newUserDO;user.setIdrecord.getBigint"id";user.setNamerecord.getString"name";returnuser;},dataList>{userDAO.batchInsertdataList;returntrue;};普通的建造者模式,实现时需要定义DataHandler接口,调用时需要实现DataHandler匿名内部类,代码较多较繁琐。而精简后的建造者模式,充分利用了函数式编程,实现时无需定义接口,直接使用Function接口 调用时无需实现匿名内部类,直接采用lambda表达式,代码较少较简洁。

Spring中最重要的 模式就是AOPAspectOrientedProgramming,面向切面的编程,是使用JDK动态 和CGLIB动态 技术来实现的。

普通

基于AOP的异常处理

删除项目中的已废弃的包、类、字段、方法、变量、常量、导入、注解、注释、已注释代码、Maven包导入、MyBatis的SQL语句、属性配置字段等,可以精简项目代码便于维护。

普通

普通

普通

publicenumUserStatus{DISABLED0,"禁用",ENABLED1,"启用";privatefinalIntegervalue;privatefinalStringdesc;privateUserStatusIntegervalue,Stringdesc{this.value=value;this.desc=desc;}...}精简

publicenumUserStatus{DISABLED0,"禁用",ENABLED1,"启用";privatefinalIntegervalue;privatefinalStringdesc;UserStatusIntegervalue,Stringdesc{this.value=value;this.desc=desc;}...}11.4.删除final类方法的final对于final类,不能被子类继承,所以其方法不会被覆盖,没有必要添加final修饰。

普通

普通

普通

publicBooleanexistsUserLonguserId{Booleanexists=userDAO.existsuserId;returnexists;}精简

publicBooleanexistsUserLonguserId{returnuserDAO.existsuserId;}后记古语又云

有道无术,术尚可求也 有术无道,止于术。

意思是 有“道”而无“术”,“术”还可以逐渐获得 有“术”而无“道”,就可能止步于“术”了。所以,我们不要仅满足于从实践中总结“术”,因为“道”的表现形式是多变的 而应该上升到“道”的高度,因为“术”背后的道理是相通的。当遇到新的事物时,我们可以从理论中找到“道”、从实践中找出“术”,尝试着去认知新的事物。

?一文浓缩60年,程序员不可不知的开源秘史!

?CSDN总部落户长沙,共建中国开发者产业中心城市!

?雷军喜提第四家上市公司,金山云上市首日暴涨40%

?CycleGan人脸转为漫画脸,牛掰的知识又增加了!|附代码

?触发死锁怎么办?MySQL的死锁系列 锁的类型以及加锁原理了解一下!

?带血的战士|吴忌寒传相关问答 zipcode42286是美国哪里?zipcode42286是美国特伦顿美国新泽西州首府。zipcode是美国邮政局使用的一种邮政编码格式,其全称是ZoneImprovementPlan美国地区改进计划。它暗示邮件可以以更有效率及快捷地送到目的地。最基本的ZIP编 包括五个 码,随后增加了四个 码,使邮件可以更精确地传送到目的地。增加 码后的ZIP编 称为”ZIP+4″。例如 22162–1010第1、2、3位数字表示分发大区或者处理、分发中心,第4、5位数字表示邮局或者分发区域,第6、7位数字表示小区,第8、9位数字表示区段。扩展资料美国各州主要城市邮编一、亚拉巴马州英文州名缩写 AlabamaAL主要城市邮编见下表 二、阿拉斯加州英文州名缩写 AlaskaAK主要城市邮编见下表 三、亚利桑那州英文州名缩写 ArizonaAZ主要城市邮编见下表 ZIP+4编 使用原有的五个编 ,再加上额外的四个编 ,去识别五位编 的目的地内的地理分区,例如大厦、一组公寓、个体大量收件户或其他可以使用额外识别器以加强邮件分类及送件效率的单位。通常ZIP+4编 只会用在邮件的预先分拣。邮件一般都会被一部可以即时确定有效的ZIP+4编 的多行光学文字辨识器阅读。当遇上要送件至一个更精确的地方时,可以在信封上贴上一个有十一个位的邮网条码。这项科技令传送邮件的速度及准确性大升,使邮寄服务成本得以在十年来一直维持不变。

(参与记者:胡绩伟、穆青、李普、田流、李峰、阎吾、柏生、彭迪、黄钢、金凤)来源:央视网、人民网、搜狐财经、新华网、凤凰资讯、网易新闻、知乎日报、热点资讯、搜狐新闻、新浪新闻总策划:莫言策划:马云、李彦宏监制:雷军、许家印统筹:任正非、柳传志、方洪波文字:李嘉诚、董明珠、宗庆后编辑:王兴、杨元庆视频:沈南鹏视觉/海报:字节跳动、张一鸣新华社国内部新华社广东分社联合出品免责声明:本文来自腾讯新闻客户端自媒体,该文观点仅代表作者本人,搜狐号、网易号、企鹅号、百家号系信息发布平台,本平台仅提供信息存储服务。(央视网评论员)

发表回复
你还没有登录,请先 登录或 注册!