首先必须承认Java8是一个里程碑版本,这一点相信大多数Java程序员都认同,其中最著名的就是Streams&Lambda,这使得函数式编程成为可能,Java重新焕发了生机。这也是为什么即使Oracle不再支持Java8的更新,各家云厂商依然积极支持的原因。该站点是https://adoptopenjdk.net/,它允许Java8继续保留很长时间。目前很多同学在日常开发中还没有切换到Java8后续版本,所以本文打算写一个后Java8时代的特性,主要偏向于开发,不涉及GC,Compiler,JavaModule,Platform等等,如果一一讲解,估计是一篇很长的文章,当然后面可以再写一篇介绍。以下几个特点会影响我们日常的代码编写。考虑到Java13即将发布,版本覆盖从9到13,同时调整了JavaRelease的方式。在某个版本(预览版)中引入了一些功能,并在收到反馈后进行了很多增强和改进。这里就不一一说明是哪个版本的特性了,大家可以理解为Java8版本之后特性的大杂烩。参考来自pluralsight上各个版本的官方特性和Java特性介绍。var关键字(局部变量类型推导)Local-VariableTypeInferenceJava支持泛型,但是如果类型很长,不特别注意的话,可以使用var关键字,这样可以让你的代码非常简洁。JavaIDE很好地支持var,因此您不必担心代码提示和其他问题。Map>>store=newConcurrentHashMap>>();Map>>store=newConcurrentHashMap<>();Map>>store=newConcurrentHashMap>>();//lambdaBiFunctionfunction1=(vars1,vars2)->s1+s2;System.out.println(function1.apply(text1,text2));将confd文件复制到bin目录下,启动confd。sudocpbin/confd/usr/local/binconfd在实际使用中还是有一些小的限制,比如null赋值问题等等,不过这些都不是问题,马上就用。ProcessHandle虽然我们在Java中很少调用系统命令,但偶尔也会用到它,当然就是ProcessBuilder了。还有一个增强的ProcessHandle,可以了解到其他进程的一些信息,比如获取所有进程,启动进程的命令,启动时间等等。ProcessHandleph=ProcessHandle.of(89810).get();System.out.println(ph.info());CollectionfactorymethodscreateArrayList,HashSet还是用newmethod,有点过时了,直接用factorymethod直接地。Setints=Set.of(1,2,3);Liststrings=List.of("first","second");String类新增的API这里就不一一列举了。一个重要的,理解之后,就不需要第三方的StringUtils了。Repeat,isEmpty,isBlank,strip,lines,indent,transform,trimIndent,formatted等HTTP2support当然,如果你使用OkHTTP3,没有问题,如果你不想引入其他开发包,那么Java已经支持HTTP2了,代码基本差不多,当然同步异步都支持。HttpClientclient=HttpClient.newHttpClient();HttpRequestreq=HttpRequest.newBuilder(URI.create("https://httpbin.org/ip")).header("User-Agent","Java").GET().build();HttpResponseresp=client.send(req,HttpResponse.BodyHandlers.ofString());System.out.println(resp.body());TextBlock(JDK13)在之前的版本中,需要a对于大段文字,需要对双引号进行转换,非常不适合阅读,如下:StringjsonText="{"id":1,"nick":"leijuan"}";新方法textblock://language=jsonStringcleanJsonText="""{"id":1,"nick":"leijuan"}""";简单多了,可以自由编写代码,不用担心各种双引号的转换,复制共享转换等等。等等,为什么在cleanJsonText前面加上//language=json,那是什么鬼?这是IntelliJIDEA的一个特性。你的文本块还是有语义的,比如一段HMTL、JSON、SQL等等,加上这个之后,代码会马上提示。普通人,我不告诉他:)文本块的另一个小功能是基本模板功能支持。需要在文本块中引入一些上下文变量,直接%s,然后调用格式化的方法。//language=htmlStringtextBlock="""Hello%s""";System.out.println(textBlock.formatted(nick));切换升级箭头标签访问"->》的switch箭头,不用写那么多break,代码如下:println(2);break;}default:{System.out.println("Unknown");}}//Arrowlabelsswitch(DayOfWeek.FRIDAY){caseMONDAY,FRIDAY,SUNDAY->System.out.println(6);caseTUESDAY->System.out.println(7);caseTHURSDAY,SATURDAY->System.out.println(8);caseWEDNESDAY->System.out.println(9);}Switch表达式,即switch可以有返回值,代码如下://Yieldingavalueinti2=switch(DayOfWeek.FRIDAY){caseMONDAY,FRIDAY,SUNDAY->6;caseTUESDAY->7;caseTHURSDAY,SATURDAY->8;caseWEDNESDAY->9;default->{yield10;}};关键字yield表示switch表达式的返回值。我想立即使用这些功能。你说了那么多,很好,但是我们线上还是Java8环境,有什么用?看看吧。别着急,也有人想到了。https://github.com/bsideup/jabel就是这个项目,它支持将JDK12+的各种语法透明编译到Java8的VM中,也就是你可以利用这些语法特性在Java8上运行而不需要任何问题,所以即使是Java8环境也没有问题,可以使用上面的特性。如何使用?很简单。先下载最新的JDK,比如JDK13,然后添加jabel-java-plugincom.github.bsideup.jabeljabel-javac-plugin0.2.0然后调整maven编译插件,source设置成你想要的Java版本,比如13,target和release设置成8,IntelliJIDEA会自动识别,并且无需调整。org.apache.maven.pluginsmaven-compiler-plugin3.8.11388让你可以愉快的使用引入的功能。综上所述,如果有一些功能没有整理出来,但是很好用,请大家反馈,比如API的调整,方便后续的同学参考。