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

速览Java11到17的新特性俏皮版

时间:2023-03-19 01:41:16 科技观察

是不是觉得老牌开发语言Java的地位有点摇摇欲坠,近几年一直在迎头赶上,不断取长补短新语言,甚至吸收函数式编程语言垃圾收集器的性能也越来越强。恐怕它会过时。甚至让广大码农都觉得学不会。很多项目还停留在Java6和8上,很少有项目敢跟上Java的脚步。话虽如此,该学的还是要学的。俗话说,作为码农,生是人学,死亦是学鬼。你必须活到死,你要学会死。学习到最后,让我们快速浏览一下Java11到17各个版本的新特性,看完再复习一遍,说不定可以在下一个项目中用到。Java11一条命令直接运行源代码文件从Java11开始,不再需要走老套的“编译-编译-运行”流程。赶时间的时候可以直接使用java命令运行源码文件。纸尿裤不湿也省了。如果你不需要一个大项目,写一个小程序或脚本要方便得多。学python可以省钱,离交女朋友又近了一步不是吗?javaRunMe.javaString又长大了曾几何时,Java的String用起来真的很累!最常用的空判断方法还需要引入一个工具库,真想骂人。这下好了,学士版的Java终于找到良心了,一下子给String加了4个血细胞,妈妈再也不用担心我掉头发了:.isBlank—如果是空的或者只包含空格,返回真。.lines-将字符串转换为由换行符分隔的字符串流。.strip—从字符串中删除所有前导和尾随空格。.repeat—重复一个字符串n次以产生一个新字符串。//isBlankaassertTrue("".isBlank());assertTrue("".isBlank());assertFalse("notblank".isBlank());//linesassertEquals(List.of("hello","world!"),"hello\nworld!".lines().collect(Collectors.toList()));//stripassertEquals("hello","hello".strip());//repeatassertEquals("echoechoecho",“回声”。重复(3));文件也变得奔放起来。天有眼。Java的单身汉版本向File类添加了两个方法,readString和writeString。您可以直接从文件中读取和写入String。这根本没有必要。如此方便,足以说明,让InputStreams类去完成如此常见的简单任务吧!//Files.writeStringPathtempFile=Files.createTempFile(Path.of("target"),"test",".txt");Files.writeString(tempFile,"HelloWorld!");//Files.readStringStringread=Files.readString(tempFile);assertEquals("HelloWorld!,read");Collection也想改变性别。美国正在实施性别战略。高级的我们是看不懂的。收藏受不了了。学士版会推出toArray的方法,如果要大改,收藏后瞬间改数组,直接省去了去泰国的操作费。varlist=List.of("x","y","z");//toArrayassertArrayEquals(newString[]{"x","y","z"},list.toArray(String[]::新的));Predicate大胆的说,在我们的印象中是没有的。谓语一向唯唯诺诺,连个屁都不敢放。不知道是不是继承了父亲的2亩地,开始变得有些不一样了。敢说不能说(加了not方法),真是旧社会农民翻身了,不信你看:PredicateisTrue=(Booleanb)->b;assertTrue(Predicate.not(isTrue).test(false));Lambda说:我可以再来一次,你敢吗?Lambda表达式中的参数支持类型推断。这一次,它走到了悬崖边上,支持var变量,允许@Nonnull、@Nullable等修饰符。虽然有一些限制,但一定要简洁方便。这么多,不禁让人着急,老兰,别倒!PredicateisTrue=(@Nonnullvarb)->b;assertTrue(isTrue.test(true));HttpClient:Web必须是3.0,想开发HTTP。2很多年了,WebSocket用的也很多,Web要3.0了。Java的光棍儿子看着手中笨拙的祖传HttpURLConnection老枪,狠狠地说:都烧了,换把新的吧!HttpClient客户端=HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build();HttpRequest请求=HttpRequest.newBuilder(URI.create("https://worldtimeapi.org/api/timezone/Europe/London")).build();HttpResponseresponse=client.send(请求,HttpResponse.BodyHandlers.ofString());assertEquals(200,response.statusCode());飞行记录仪:看我干爹多厉害,据说现在是拼爹时代,演员后代继续要做星二代,写手也想让孩子继续在我的圈子里混,连Java都开始争抢我爸了。眼里含着泪,Oracle把我保存多年的飞行记录功能拿出来,交给了Java。棒子感激地说,看我干爹多好,以后再也不怕生病了。Java12String:哭的孩子有奶。有两种不痛的方法,感觉oracle有点大材小用,太用力了。如果你不相信我,看看它。.indent-通过给定的偏移量调整每行的缩进,可以是正数也可以是负数。.transform—将trasform转换函数应用于字符串。assertEquals("hello\nworld!\n","hello\nworld!".indent(4));assertEquals("Capital","capital".transform((str)->str.substring(0,1).toUpperCase()+str.substring(1)));File:我也会玩找不同。真是一个文字为王的时代。在String受到青睐之后,Files文件处理类也加入了文本相关的方法mismatch。使用此方法可以找到两个文件之间比较中不匹配的第一个字节的索引位置。你在干什么?今年的Java真是看不懂啊!路径target=Path.of("target");路径x=Files.createTempFile(target,"x",".txt");路径y=Files.createTempFile(target,"y",".txt");Files.writeString(x,"敏捷的棕色狐狸跳过懒狗");Files.writeString(y,"快速的棕色狐狸跳过懒狗");//^assertEquals(4,Files.mismatch(x,y));收藏家:谁要换水电?来找我!装修工地上那个红锅的短视频你见过吗?不好笑吗?这不,Java12中的采集工具类要装扮成网红了。不知道从哪里学来的打三通,吵着要找工作。真的很神奇!varnumbers=Stream.of(10,20,30);var平均值=数字。collect(Collectors.teeing(Collectors.summingInt(i->i),Collectors.counting(),(sum,count)->sum/count));assertEquals(20,average);NumberFormat:看我的24K大金齿。曾几何时,国内也开始向老外学习,工资开始说多少K,明显不符合国内的习惯吧?不,我们顺势而为,升华了。多少万说了多少Ws。估计这老外要糊涂了,哈哈!言归正传,看看NumberFormat介绍的这种简洁的数字格式化方法,是不是很实用?为什么!只希望下个版本能加入W。NumberFormatshortFormat=NumberFormat.getCompactNumberInstance(newLocale("en","GB"),NumberFormat.Style.SHORT);shortFormat.setMaximumFractionDigits(2);assertEquals("12.35K",shortFormat.format(12345));Java13“第13”人伤耶稣,老外从此对这个数字深恶痛绝,这个版本连一个毛茸茸的特征。Java14Switch:我不再是老哥了Switch也可以做表情,我也可以为社会做点贡献。我不再是老哥了...varmonth=AUGUST;booleanisSummer=switch(month){caseJUNE,JULY,AUGUST->true;default->false;};assertTrue(isSummer);NPE:colorisnothing,nothingiscolor还记得历史上最昂贵的异常吗?那就是我的空指针异常,你不是一直都知道什么是null吗?这次我可以认真的告诉你。字符串缺失=null;try{missing.toLowerCase();}catch(NullPointerExceptionnpe){assertEquals("Cannotinvoke\"String.toLowerCase()\"because\"missing\"isnull",npe.getMessage());}Java15文本Block:最好平躺着,别这么拼!Java15终于凭良心发现了,多行文字不再需要这么拼了。varatLast="""{"text":"块!"}""";隐藏类:隔壁老王大爱Java15,介绍了不能被其他类链接,也不能通过反射发现的隐藏类的使用。王日思夜想的技能!InputStreamstream=TestJavaFifteen.class.getClassLoader().getResourceAsStream("HiddenClass.class");MethodHandles.Lookuplookup=MethodHandles.lookup().defineHiddenClass(stream.readAllBytes(),true,MethodHandles.Lookup.ClassOption.NESTMATE);Classhidden=lookup.lookupClass();Objectinstance=hidden.getDeclaredConstructor().newInstance();Objectresult=hidden.getMethod("hello").invoke(instance);assertEquals("HelloWorld!",结果);Shenandoah,ZGC:不要停下来!最烦人的GC(我说的是垃圾回收,别想了!)暂停。这一直是Java饱受诟病的地方。不过,这次不用再担心了。Java15发布了两款高性能GC神器,Shenandoah和ZGC。后者的GC停顿时间甚至不超过10毫秒。Java16Day期:有没有人分不清evening和evening,morning和morning?B字符被添加到Java日期格式符号中,用于使用当地约定来选择一天中的时间,例如:morning/noon/afternoon/evening/evening/midnight等。LocalTimedate=LocalTime.parse("07:13:09");DateTimeFormatterformatter=DateTimeFormatter.ofPattern("hB");assertEquals("7inthemorning",date.format(formatter));StreamtoList:later去前门!StreamAPI在JavaPomegranate版本中推出了姗姗来迟的toList,让我们等了8个版本。这是饥饿营销的地方吗?神谕大哥,良心不会痛吗?//Java16varlist=Stream.of(1,2,3).toList();assertEquals(List.of(1,2,3),list);//java8Stream.of(1,2,3)).collect(Collectors.toList());记录:海枯石烂万古。爪哇石榴版本已经开始在市场上与钻石竞争。它引入了一种使用Record创建不可变对象的方法。以后码农连钻石的钱都省了吗??公共记录电影(字符串标题,整数评级){}@Testvoidrecords(){varstarWars=newMovie(“星球大战”,5);assertEquals("星球大战",starWars.title());assertEquals(5,starWars.rating());assertEquals(starWars,newMovie("星球大战",5));}instanceof:拿起!Java石榴版instanceof看好我的腿病,再也不用拐杖(括号)了!Objectb=true;if(binstanceofBooleanc){//c是布尔类型}Objectvalue=data.get("key");if(valueinstanceofStrings){System.out.println(s.substring(1));//e}Localenums,interface:这是我老婆,不用担心!Java石榴版引入了局部枚举和局部接口特性,范围仅限于方法内部,教人独食开始!//本地枚举@TestvoidlocalEnums(){enumTriBoolean{True,False,Maybe}assertEquals(TriBoolean.True,TriBoolean.True);}//本地接口@Testvoidinterfaces(){interfaceHello{Stringhello();字符串再见();}Hellohello=newHello(){@OverridepublicStringhello(){return"helloworld!";}@OverridepublicStringgoodbye(){return"再见,残酷的世界!";}};assertEquals("helloworld!",hello.hello());assertEquals("goodbyecruelworld!,hello.goodbye());}Java17Sealedclasses/interfaces:小姑娘只卖艺不卖身Java老十七版推出Sealedclassesandsealedinterfaceslimitthesetof可以扩展或实现它们、增强类型安全性并有助于与switch语句进行模式匹配的类sealedinterfaceCatFamilypermitsLion,Tiger{Stringmiow();}finalclassLionimplementsCatFamily{@OverridepublicStringmiow(){返回“ROAR!”;}}final类Tiger实现CatFamily{@OverridepublicStringmiow(){return"CHOMP!";}}//编译错误,因为第1行的接口权限不允许BearfinalclassBearimplementsCatFamily{@OverridepublicStringmiow(){return"Uhh?";LTS不添加新的语言功能。后续的LTS也可能从3年版本加速到2年版本。甲骨文很着急。你怎么看待这件事?