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

从Java9到Java17Java11

时间:2023-03-13 22:00:08 科技观察

Java11是Java8之后的又一个LTS版本,也是目前全球使用最多的LTS版本之一。今天我们继续在Java9到Java17系列文章中为普通开发者学习Java11。StringAPI增强在Java11中,对String的操作得到了进一步增强。避免我们在非常常见的场景中引入额外的、复杂的API。isBlank()用于判断字符串是否为空白字符""或trim()("")后为空白字符:StringblankStr="";//truebooleantrueVal=blankStr.isBlank();lines()将一个string根据Lineterminators(换行符\n或回车符\r)进行拆分,将拆分为Stream流:StringnewStr="HelloJava11\nfelord.cn\r2021-09-28";Streamlines=newStr.lines();lines.forEach(System.out::println);//HelloJava11//felord.cn//2021-09-28strip()去掉and前的“全角半角”空白字符在字符串之后:Stringstr="HELLO\u3000";//str=6System.out.println("str="+str.length());//trim=6System.out.println("trim="+str.trim().length());//strip=5System.out.println("strip="+str.strip().length());这让我想起了trim()方法,从上面可以看出区别,trim()只能去掉Half-widthwhitespace。strip()方法有两种变体。stripLeading()用于去掉前面的全角和半角空白;stripTrailing()用于删除尾随的全角和半角空白。repeat(n)按照给定的次数重复拼接字符串的内容:Stringstr="HELLO";//空字符Stringempty=str.repeat(0);//HELLOStringrepeatOne=str.repeat(1);//HELLOHELLOStringrepeatTwo=str.repeat(2);在集合转换为对应类型的数组之前,先将集合传递给对应的数组,非常麻烦。使用迭代或流流。现在你可以这样做:ListsampleList=Arrays.asList("felord.cn","java11");//array={"felord.cn","java11"};String[]array=sampleList.toArray(String[]::new);断言否定java.util.function。Predicate是我们非常常用的断言谓词函数。过去,我们不得不使用!symbol来反转,但是在Java11中我们可以使用它的静态方法不实现它,这样语义更清晰:ListsampleList=Arrays.asList("felord.cn","java11","jack");//[jack]Listresult=sampleList.stream()//过滤以j开头的字符串.filter(s->s.startsWith("j"))//同时不过滤的字符串包含11.filter(Predicate.not(s->s.contains("11"))).collect(Collectors.toList());其实Predicate在初始版本中也提供了一个默认的否定方法:defaultPredicatenegate(){return(t)->!test(t);}我在之前的文章中也用过它来进行组合验证。这两种方式的场景是不一样的。var可用于修饰Java10中引入的Lambda局部变量var以进行类型推断。在Java10中,它不能用于修改Lambda表达式的输入参数。事实上,对于一个Lambda表达式,其输入参数的类型实际上可以从上下文中推断出来。以上面的例子为例,s->s.startsWith("j")中的s必须是string类型,所以在Java11中可以用var修饰Lambda局部变量:Listresult=sampleList.stream()//过滤以j开头的字符串.filter((@NotNullvars)->s.startsWith("j"))//不同时包含11的字符串.filter(Predicate.not((@NotNullvars)->s.contains("11"))).collect(Collectors.toList());如果我们不声明var,就没有办法给入参加上@NotNull注解。在文件中读写字符串内容更方便。在Java11中,从文件中读取和写入字符串内容更加容易。我们可以使用Files工具类提供的新静态方法readString和writeString分别读写文件。字符串内容放之前比较麻烦,尤其是对IO流不熟悉的同学。现在简单几行就搞定了:Stringdir="C://yourDir";//写入文件Pathpath=Files.writeString(Files.createTempFile(dir,"hello",".txt"),"hellojava11");//读取文件StringfileContent=Files.readString(path);嵌套类的访问控制规则在Java11之前,内部嵌套类访问外部类的私有属性和方法是可行的:;}}}但是如果你实现内部类通过反射API访问外部类的私有属性和方法,就会抛出IllegalStateException。Java11修复了无法访问反射的问题。JVM访问规则不允许嵌套类之间的私有访问。我们可以通过正常方式访问它,因为JVM在编译时隐式地为我们创建了桥接方法。Java11中引入了两个新属性:一个称为NestMembers,用于标识其他已知的静态嵌套成员;另一个是每个嵌套成员所包含的NestHost属性,用于标识其嵌套宿主类。双方的宿主关系在编译时就已经映射好了,不再需要桥接。HttpClient支持HTTP2HttpClient在Java11之后开始支持HTTP2,底层做了很大的优化,现在全面支持异步非阻塞。HttpClient包名由jdk.incubator.http改为java.net.http。在其他Java11中,还有一些其他的特性和优化,比如ZGC的引入,对TLS1.3协议的支持,动态调用(invokedynamic)机制的引入,以及JFR原有商业版也已经开源整合等等。年初的Java生态调查数据显示,Java11的用户数量大幅增加,成为主流版本选择之一。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。