当前位置: 首页 > 科技观察

使用IDEA的60+快捷键分享给大家,提高效率的权利(LiveTemplate&Postfix补全篇)

时间:2023-03-14 21:06:49 科技观察

扔掉鼠标,提高效率。本文已被https://yourbatman.cn收录;NuwaKnife-Initializr项目可公开访问;程序员专用网盘https://wangpan.yourbatman.cn;技术栏目源码大本营:https://github。com/yourbatman/tech-column-learning;在公众号后台回复“专栏列表”,获取所有小而美的原创技术专栏。前言本系列的上一篇文章介绍了IDEA中代码重构相关的快捷键。利用好Java强类型语言的特点,再加上IDEA的重构快捷键,可以带来极大的方便和“安全”,进而为想重构又不敢做的心提供前提条件。在敲代码的过程中,我总是“讨厌”,经常会写一些重复的代码,比如:logger日志语句,main方法,System.out.println()。..本文就针对这个“痛点”,让我们一起来学习IDEA的LiveTemplate和PostfixCompletion功能,看看它能给我们带来多少便利。专栏【方向盘】——IntelliJIDEA。相关下载【本专栏源码】:https://github.com/yourbatman/FXP-java-ee。【技术专栏源码大本营】:https://github.com/yourbatman/tech-column-learning。【女娲刀-Initializr项目】访问地址:http://152.136.106.14:8761。【程序员网盘】公益上线,注册送1G超小容量,帮你练减法:https://wangpan.yourbatman.cn。【Java开发软件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0提取码:javakit。版本约定MacOS12.3.1。iTerm23.4.15(zsh5.8)。IntelliJIDEA2022.1。文本初级程序员热衷于“自动”生成代码,各种代码生成工具,比如MyBatis逆向工程、easycode插件等等。许多公司禁止在团队内部使用此类工具,原因很简单:生成的垃圾代码太多。但是在日常编程的过程中,我们确实经常会遇到需要重写的代码片段。如何打破它们?这就是我们接下来要讨论的,用IDEA的“工具”来代替这些“重复劳动”。IntelliJIDEA快捷键本文不直接介绍快捷键,但是LiveTemplate和PostfixCompletion都有类似的功能,所以在本专栏中一起介绍。什么是实时模板模板?顾名思义,它根据预先定义的内容和格式执行或输出。使用模板一般有一些好处:编写的代码风格可以保持一致。只需要几个引用字符就可以得到代码块的完整逻辑,并且保证了正确性。不会有因为忘记更改某些参数而导致的CV代码、编译甚至运行时问题。那么什么是实时模板?区别就在于这个Live,这个词的直译是:现场直播,当下关注。所以笔者对LiveTemplate的理解是:有上下文感知的模板比普通的Templates更聪明、更智能。其实网上有很多文章“吹嘘”LiveTemplate功能强大好用,而且不吝赞美之词。但是,笔者结合自己相当多的工作经验和学习经验,发现吹嘘这个功能的人很多,真正去用的人却寥寥无几。所以每次看到这种文章,我都想问作者三个问题:这真的是你的经验分享吗?那些“强大”的功能真的在用吗?还是只是为了吸引眼球,获取流量?在这里,笔者首先提出自己的个人观点:LiveTemplate确实是一个强大的功能,支持很多方法甚至groovy脚本,但是从效率的角度来说,它的强大和灵活让通用性和实用性差了一些。因此,尽管笔者在刚开始使用IDEA(2017)的时候已经接触并使用过LiveTemplate,但直到现在仍然对它不感兴趣,用到的功能点也越来越少。说了这么多,只是一个观点,跟个人的使用习惯和认知有很强的关系。虽然我很少使用它,但我仍然使用它。下面简单说说这个功能。如下图所示:这是笔者目前使用的所有LiveTemplate模板。Tips:按快捷键common+j显示当前环境下(类中或方法中)所有可以使用的LiveTemplate模板类(6):方法(3)中:如下设置作者的IDEA:由于作者多年不写前端,不会写Android,偶尔会写Groovy、Shell等脚本,所以从上图可以看出只有几个模板Java项目被打开。效果概览通过录制的动画,你可以感受到LiveTemplate的强大,感受它的效果:这里一共使用了三个模板:psvm:generatemain方法。fori:生成一个普通的for循环。sout:生成标准输出语句。话不多说,通过介绍我自己使用的模板来简单感受一下LiveTemplate。main和psvm的使用方法:在类的任意位置,输入main或psvm,然后按tab键触发。作用:快速生成/声明main方法。值得注意的是,在早期的IDEA版本中,只支持psvm这种LiveTemplate。从xxx版本开始(记不清是从哪个版本开始的)也支持main(这对于从eclipse转过来的开发者来说是个福音),效果和psvm完全一样。我更喜欢使用main,这显然更熟悉。sout和serr在方法内部触发,快速“生成”标准输出和错误输出语句。sout:System.out.println();//sout标准输出serrSystem.err.println();//serrerroroutput下面介绍的PostfixCompletion也有类似的功能,可以串起来比较,下同。soutc、serrc使用条件:方法参考/lamda表达式。可见,这两兄弟的触发条件还是相当苛刻的。soutc:System.out::printlnserrc:System.err::println结束。笔者常用的只有几个LiveTemplates,发现没有fori也没用。当然,作者也自定义了几个LiveTemplates来应对特殊场景。doc和docc快速生成类的javadoc。做开发的时候,一般来说类都是需要写javadoc的,每个方法的javadoc要求会比较宽松,不强制。这两个Templates是来帮我解决class上的javadoc问题的。doc:/***在此处添加备注**@authorYourBatman。发邮件给我*@sitehttps://yourbatman.cn*@date2022/5/122:29*@since0.0.1*/publicclassDemo{...}docc:/***在此处添加备注**@authorYourBatman。给我发邮件*@site公司网址或项目地址或文件的git地址*@date2022/5/122:29*@since0.0.1*/publicclassDemo{...}为什么有两个?doc是作者自己写代码的时候用的,docc是在公司开发用的。记录器快速声明记录器日志实例属性。logger:privatefinalLoggerlogger=LoggerFactory.getLogger(this.getClass());可能有同学会问,logger很多时候不是静态的吗?像这样:privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(Demo.getClass());是的,很多时候logger确实是静态的,而这个时候作者会使用lombok的@Slf4j注解来代替“手敲”。唠叨一句:初学者在学习时常有一个误区:更喜欢用static(变量、方法)。作者的建议大体上是:优先选择实例(变量、方法),原因很简单,在工程领域,面向对象编程的优势远大于面向过程编程。CustomLiveTemplate嗯,这个,贴出我的一个自定义细节应该差不多就够了:当然,LiveTemplate的强大远不止于此。比如它内置了上百个变量,你可以自由组合,灵活定义模板,甚至还支持自定义Groovy脚本,强大到没有朋友。但是,你明白了。一方面,我觉得用手敲复杂结构的代码更安全,也能锻炼敲代码的手速;无需定义复杂的模板。PostfixCompletion(后缀补全)是IDEA代码补全的利器,在实用性上远优于LiveTemplate(个人观点,喜欢勿喷)。如果说LiveTemplates更智能,那么PostfixCompletion会给用户带来更好的确定性和易用性。解释:在上一篇文章中提到,使用快捷键提高效率是一个非常非常非常重要的前提:确定性。只有一步到位才能确定,只有一步到位才能直接提高效率。顾名思义,后缀补全功能的自动补全代码是通过在语句后输入特定元素并敲击tab键来完成自动补全的。下面截图是笔者在使用PostfixCompletion时的情况:这里有几个简单的介绍:!用在bool表达式语句中表示不是。如:if(relation==Relation.GOOD!){...}输入tabtrigger后会自动变为:if(relation!=Relation.GOOD){...}booleanbool=nums.size()>3!;输入tab后自动变为:booleanbool=nums.size()<=3;booleanbool=nums.contains(3)!;输入tab后会自动变成:booleanbool=!nums.contains(3);var用的太频繁了,很好用。它可以为您快速生成局部变量的前半部分(声明部分)。它通常用于getXXX:Countrycountry=newCountry();country.getId().var自动变为:Longid=countryaftertypingtabtrigger.getId();country.getCnName().var将自动变为:StringcnName=country.getCnName();country.getEnName()。var会自动变为:StringenName=country.getEnName();cast,castvar力传递,力传递和生成变量。大多数情况下后者会用的比较多,castvar=cast+var的组合,合二为一。Objectstr="helloyourbatman";str.castvar会自动变为:Objectstr="helloyourbatman";Strings=(String)str;Objectnums=Arrays.asList(1,2,3);nums.castvaris自动更改为:Objectnums=Arrays.asList(1,2,3);Listobjects=(List)nums;nums这个例子,当IDEA无法推断出泛型时,光标会停在不确定的地方让你输入,使用起来非常流畅。for、fori、forr、iter等后缀可以快速生成遍历代码。下面,笔者将举例说明几种可以遍历的类型,看看它们之间的异同。Arrayarray:String[]strArr={"a","b","c"};//strArr.for增强for循环for(Strings:strArr){}//strArr.fori正序遍历for(inti=0;i=0;i--){}//strArr.iter与strArr相同。for增强for循环for(Strings:strArr){}Collectioncollection:Collectioncoll=Arrays.asList("a","b","c");//coll.for增强forloopfor(Strings:coll){}//coll.fori正向遍历for(inti=0;i=0;i--){}//coll.iter和strArr.for一样增强了for循环for(Strings:coll){}可以看出Collection和Array的性能是一样的。最后看一下Map:Map不能直接使用for遍历,而是使用foreach进行迭代。另外,在使用for循环遍历之前,也可以将map“转化为Collection”,像这样:Mapmap=Collections.emptyMap();SetmapKeys=map.keySet();CollectionmaoValues=map.values();Set>mapEntries=map.entrySet();对于Map的遍历,笔者最推荐的是foreach迭代遍历方式,这种方式最容易使用方便。当然,有时也会使用for循环的方式进行遍历(先转换为Collection)。这时候,我更喜欢使用Entry方法。你呢?Tips:对于遍历,还有一个Iterator方法。你还记得如何使用它吗??new使用构造函数new对象。有同学会问,这和newDemo()类似,确实类似。但是当你大量使用后缀补全时,你会发现它真的很有用。return返回很快,也很好用。result.return->返回结果;除了这些,还有一些常用的和很好用的后缀:opt,serr,sout,throw,while等。CustomPostfixCompletion就是这么一个好用的功能,如果现有的还不够用,当然你也可以自定义一个.以作者自定义的一个json后缀为例:将任意值序列化为json字符串。定义如下:因为任何类型都可以序列化成JSON字符串,所以这里的Applicableexpressiontypes没有写。Tips:在正常开发中,我司禁止使用Fastjson。这仅用于演示目的。有些后缀有使用的“前提条件”,比如必须是集合类型,或者必须是字符串类型等,这时候可以通过适用的表达式类型来缩小范围(如下图,多选被允许)以获得更好的确定性和正确性。总结本文介绍了IDEA的LiveTemplate功能PostfixCompletion后缀补全功能,看来兄弟俩完全可以“代码生成”。但区别仍然很明显:LiveTemplate功能强大且灵活。它不是一个简单的代码片段。支持任意组合和定制,甚至支持Groovy函数配置。可以自定义非常复杂的模板逻辑,最后一键生成PostfixCompletion。指定触发的后缀,它在触发的时候已经有了prerequisite(context),所以更容易使用和理解,也就是我理解的更确定性一些功能没有好坏之分,重点在于用户如何使用。尊重每个人的使用偏好,支持极客风格的同学将某些功能发挥到极致,甚至研究其原理。LiveTemplate&PostfixCompletion看似需要大量内存,其实本质和快捷键一样,用了之后就成了肌肉记忆。还是要补上那句话:快捷键没有技巧,练完了!下篇继续介绍IntellijIDEA的实用快捷键。那么,我们下次再见!