Java17与Java11相比有什么变化?(下)
Java17与Java11相比有什么变化?(上)6。instanceof的模式匹配
通常需要检查对象是否属于某种类型,如果是,首先要做的是将对象强制转换为该特定类型的新变量。可以在以下代码中看到一个示例:privatestaticvoidoldStyle(){System。out。println(OldStyle);ObjectonewGrapeClass(Color。BLUE,2);if(oinstanceofGrapeClass){GrapeClassgrape(GrapeClass)o;System。out。println(Thisgrapehasgrape。getNbrOfPits()pits。);}}
输出是:Thisgrapehas2pits。
使用instanceof的模式匹配,上面的可以改写如下。如您所见,可以在instanceof检查中创建变量,并且不再需要用于创建新变量和转换对象的额外行。privatestaticvoidpatternMatching(){System。out。println(Patternmatching);ObjectonewGrapeClass(Color。BLUE,2);if(oinstanceofGrapeClassgrape){System。out。println(Thisgrapehasgrape。getNbrOfPits()pits。);}}
输出当然与上面相同。
仔细查看变量的范围很重要。它不应该是模棱两可的。在下面的代码中,之后的条件只会在instanceof检查结果为true时进行评估。所以这是允许的。将更改为不会编译。privatestaticvoidpatternMatchingScope(){System。out。println(Patternmatchingscopetest);ObjectonewGrapeClass(Color。BLUE,2);if(oinstanceofGrapeClassgrapegrape。getNbrOfPits()2){System。out。println(Thisgrapehasgrape。getNbrOfPits()pits。);}}
下面的代码显示了另一个有关范围的示例。如果对象不是GrapeClass类型,则抛出RuntimeException。在这种情况下,永远不会到达打印语句。在这种情况下,也可以使用grape变量,因为编译器肯定知道grape存在。privatestaticvoidpatternMatchingScopeException(){System。out。println(Patternmatchingscopetestwithexception);ObjectonewGrapeClass(Color。BLUE,2);if(!(oinstanceofGrapeClassgrape)){thrownewRuntimeException();}System。out。println(Thisgrapehasgrape。getNbrOfPits()pits。);}7。有用的空指针异常
有用的NullPointerException将为您节省一些宝贵的分析时间。以下代码导致NullPointerException。publicclassHelpfulNullPointerExceptions{publicstaticvoidmain(String〔〕args){HashMapString,GrapeClassgrapesnewHashMap();grapes。put(grape1,newGrapeClass(Color。BLUE,2));grapes。put(grape2,newGrapeClass(Color。white,4));grapes。put(grape3,null);varcolor((GrapeClass)grapes。get(grape3))。getColor();}}
对于Java11,输出将显示NullPointerException发生的行号,但您不知道哪个链式方法解析为null。你必须通过调试的方式找到自己。Exceptioninthreadmainjava。lang。NullPointerExceptionatcom。mydeveloperplanet。myjava17planet。HelpfulNullPointerExceptions。main(HelpfulNullPointerExceptions。java:13)
在Java17中,相同的代码会产生以下输出,其中准确显示了NullPointerException发生的位置。Exceptioninthreadmainjava。lang。NullPointerException:Cannotinvokecom。mydeveloperplanet。myjava17planet。GrapeClass。getColor()becausethereturnvalueofjava。util。HashMap。get(Object)isnullatcom。mydeveloperplanet。myjava17planet。HelpfulNullPointerExceptions。main(HelpfulNullPointerExceptions。java:13)8。精简数字格式支持
NumberFormat中添加了一个工厂方法,以便根据Unicode标准以紧凑的、人类可读的形式格式化数字。SHORT格式样式如下面的代码所示:NumberFormatfmtNumberFormat。getCompactNumberInstance(Locale。ENGLISH,NumberFormat。Style。SHORT);System。out。println(fmt。format(1000));System。out。println(fmt。format(100000));System。out。println(fmt。format(1000000));
输出是:1K100K1M
LONG格式样式:fmtNumberFormat。getCompactNumberInstance(Locale。ENGLISH,NumberFormat。Style。LONG);System。out。println(fmt。format(1000));System。out。println(fmt。format(100000));System。out。println(fmt。format(1000000));
输出是:1thousand100thousand1million
荷兰语替换英语的LONG格式:fmtNumberFormat。getCompactNumberInstance(Locale。forLanguageTag(NL),NumberFormat。Style。LONG);System。out。println(fmt。format(1000));System。out。println(fmt。format(100000));System。out。println(fmt。format(1000000));
输出是:1duizend100duizend1miljoen9。添加了日周期支持
添加了一个新模式B用于格式化DateTime,该模式根据Unicode标准指示日期时间段。
使用默认的中文语言环境,打印一天中的几个时刻:System。out。println(Chineseformatting);DateTimeFormatterdtfDateTimeFormatter。ofPattern(B);System。out。println(dtf。format(LocalTime。of(8,0)));System。out。println(dtf。format(LocalTime。of(13,0)));System。out。println(dtf。format(LocalTime。of(20,0)));System。out。println(dtf。format(LocalTime。of(23,0)));System。out。println(dtf。format(LocalTime。of(0,0)));
输出是:上午下午晚上晚上午夜
现在使用荷兰语本地环境:System。out。println(Dutchformatting);dtfDateTimeFormatter。ofPattern(B)。withLocale(Locale。forLanguageTag(NL));System。out。println(dtf。format(LocalTime。of(8,0)));System。out。println(dtf。format(LocalTime。of(13,0)));System。out。println(dtf。format(LocalTime。of(20,0)));System。out。println(dtf。format(LocalTime。of(0,0)));System。out。println(dtf。format(LocalTime。of(1,0)));
输出如下。请注意,英国之夜从23点开始,荷兰之夜从01点开始。可能是文化差异;)。’sochtends’smiddags’savondsmiddernacht’snachts10。Stream。toList()
为了将Stream转换为List,您需要使用collect的Collectors。toList()方法。这非常冗长,如下面的示例所示。privatestaticvoidoldStyle(){System。out。println(Oldstyle);StreamStringstringStreamStream。of(a,b,c);ListStringstringListstringStream。collect(Collectors。toList());for(Strings:stringList){System。out。println(s);}}
在Java17中,添加了一个toList方法来替换旧的行为。privatestaticvoidstreamToList(){System。out。println(streamtoList);StreamStringstringStreamStream。of(a,b,c);ListStringstringListstringStream。toList();for(Strings:stringList){System。out。println(s);}}11。结论
在本文中,您快速浏览了自上一个LTS版本Java11以来添加的一些功能。现在由您开始考虑迁移到Java17的计划,以及了解有关这些新功能的更多信息以及您如何可以将它们应用到您的日常编码习惯中。提示:IntelliJ会帮你解决这个问题!
写一写和手机有关的回忆从初中到大学我一共买过6部手机。现在正在用第六部手机写文章。第一部手机是一部老人机,因为当时的我还只是初中生而已。所以只能用老人机。老人机是如何来的我已经忘了,现在已经不……
JDK18Java18GA发布一早上班发现JDK18已经发布了,尼玛,JDK8还没用溜呢,先看看18支持什么吧。默认编码为UTF8简易HTTP服务器JavaAPI文档中的代码片段用方法句柄(MethodHa……
什么是主网上线?对于主网上线,或许你已经听说过很多回了。究竟什么是主网上线?主网上线对区块链项目而言是好是坏,是起点还是终点?主网上线后,原先的Token怎么办,还有价值吗?或许这些问题……
20万片乐视手机库存电芯曝光!近期,业内电芯大卖家向充电头网透露,众多乐视手机库存电芯出现在市面上,数量多达数十万片。这些电芯为黑色封套,喷有独立的二维码和对应SN序列号。这批电芯由业内顶级电芯厂生产……
物联网在智慧城市中的应用与发展智慧城市是指利用各种信息技术或创新概念,将城市的系统和服务打通、集成,以提升资源运用的效率,优化城市管理和服务,以及改善市民生活质量。智慧城市经常与数字城市、感知城市、无线城市……
新加密货币之都?外媒称美国得州电力廉价渐成比特币乐土英国《泰晤士报》网站近日报道称,美国得克萨斯州正在成为世界加密货币中心。报道称,近期,比特币行业纷纷迁往美国得克萨斯州。这种迁移的速度和程度令人震惊,对于被越来越多金融机……
5。9英寸的骁龙888旗舰发布4700起售5月13日,华硕的两款骁龙888新机ZenFone8和ZenFone8Flip正式发布,两款手机除了配置是目前的顶级之外,在外观设计上也都各具特色。首先是ZenFone8……
战胜恐慌投资顶流是如何应对极端行情的在别人贪婪时恐惧,在别人恐惧时贪婪。股神巴菲特的这句话被很多投资人奉为圭臬,但当恐慌在市场真实上演的时候,能够做到贪婪的人依然只是少数。近期腾讯、阿里、美团等个股走势极端……
几百元和几千元的燃气热水器差距真的很大吗?差距相当大,对于任何产品其实都一样,配置不同,价格自然不同,几百元是低端产品,几千元是中高端产品,还是那句话一分钱一分货,各行各业都一样。简单介绍一下配置和价格的区别,供……
助听器会不会很容易丢?耳背机的导管和耳塞大小都是根据患者的耳道来选择的,除非头部有剧烈运动才会掉,如果实在担心掉可以选配挂绳,这样基本就不会掉了。定制机是根据患者的耳道大小定做的,并且每个人的……
特斯拉销量腰斩,比亚迪汉EV进前三,4月新能源榜单亮点多!今日(5月12日),乘联会对外公布了新能源市场4月份的销量情况。数据显示,4月新能源乘用车零售销量达到16。3万辆,同比增长192。8,环比3月下降12。0,整个新能源乘用车市……
耳朵不好自己在网上买一个助听器可以用吗?助听器属于二类医疗器械,他并不是一个随便都能买的东西,就像近视眼镜一样的。验配需要专业流程,首先要检查耳廓以及耳道相关情况,排除耳道内有耵聍、积液、分泌物堵塞耳道的情况,判断有……