java11开箱简评
2021-04-06 01:26
标签:apply tac else 测试 trail drop nts void cto Process finished with exit code 0 for循环也可以使用: Process finished with exit code 0 2.字符串加强 测试结果: Process finished with exit code 0 3.集合加强 测试结果: Process finished with exit code 0 注意:使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报java.lang.UnsupportedOperationException异常,使用Set.of()不能出现重复元素、Map.of()不能出现重复key,否则会报java.lang.IllegalArgumentException。 takeWhile(Predicate super T> predicate) dropWhile(Predicate super T> predicate) 测试结果: Process finished with exit code 0 iterate重载 测试结果: 5.Optional增强 测试结果: Process finished with exit code 0 ifPresentOrElse(Consumer super T> action, Runnable emptyAction) 测试结果: Process finished with exit code 0 or(Supplier extends Optional extends T>> supplier) 6.文件读写增强 Process finished with exit code 0 InputStream增强 7.HTTP Client 8.直接运行java文件(这个没测。。) java Java11 结语:总体而言,java11新增的功能都是比较实用的,用起来也挺不错。虽说现在一般的项目里都用不上,但是多学一点东西还是有用的。说不定哪天就用上了。其实java8和java11还有着很多的不同,后面有空再做一期关于jdk版本的总结吧。 java11开箱简评 标签:apply tac else 测试 trail drop nts void cto 原文地址:https://www.cnblogs.com/bestlmc/p/13403119.html
最近刚好有一点时间,看到java都快更新到14了。不过主流的稳定版本还是java11,因此还是用java11来做一个简单的开箱测试吧。
首先是下载,以下是下载路径,我选择的是zip文件。
jdk11的下载路径:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html
然后就是简单的解压文件,在intelliJ里面引入即可使用。
接下来就是参考https://juejin.im/post/5dc0e1caf265da4d47042543#heading-19该文章,进行对java11的一些新特性进行测试。
新特性:
1.新增var关键字,自动推断变量类型public static void varTest(){
// 自动推断name为String类型
var name = "bestlmc";
var number = 1000000;
System.out.println(name);
System.out.println(number);
}
测试结果:
bestlmc
1000000public static void forTest(){
var upList1 = List.of( "鸣人", "佐助", "小樱" );
var upList2 = List.of( "自来也", "大蛇丸", "纲手" );
var upList3 = List.of( "弥彦", "长门", "小南" );
var upListAll = List.of( upList1, upList2, upList3 );
// 用var接受局部变量的确非常简洁!
for( var i : upListAll ) {
for( var j : i ) {
System.out.println(j);
}
}
}
测试结果:
鸣人
佐助
小樱
自来也
大蛇丸
纲手
弥彦
长门
小南
从Java 9开始 String 数据承载由 char[] 改为 byte[] 紧凑的字符串,在很多时候只包含Latin-1里的字符,这些字符可节省一半内存。public static void test(){
String testStr = " bestlmc ";
"A\nB\nC".lines().count(); // 3
System.out.println(" ".isBlank()); // 打印:true
System.out.println(" ".isEmpty()); // 打印:false
System.out.println(testStr.strip()); // 前后空格均移除
System.out.println(testStr.stripLeading()); // 仅头部空格移除
System.out.println(testStr.stripTrailing()); // 仅尾部空格移除
System.out.println(testStr.repeat(2)); // 复制字符串 bestlmc bestlmc
System.out.println("A\nB\nC".lines().count()); // 行数统计 3
}
true
false
bestlmc
bestlmc
bestlmc
bestlmc bestlmc
3public static void test(){
var upList = List.of( "鸣人", "佐助", "小樱" );
var upListCopy = List.copyOf( upList );
System.out.println(upList); // 打印 [鸣人, 佐助, 小樱]
System.out.println(upListCopy); // 打印 [鸣人, 佐助, 小樱]
var upSet = Set.of("鸣人","佐助");
var upSetCopy = Set.copyOf( upSet );
System.out.println(upSet); // 打印 [佐助, 鸣人]
System.out.println(upSetCopy); // 打印 [佐助, 鸣人]
var upMap = Map.of("鸣人","下忍","佐助","下忍");
var upMapCopy = Map.copyOf( upMap );
System.out.println(upMap); // 打印 {鸣人=下忍, 佐助=下忍}
System.out.println(upMapCopy); // 打印 {鸣人=下忍, 佐助=下忍}
}
[鸣人, 佐助, 小樱]
[鸣人, 佐助, 小樱]
[佐助, 鸣人]
[佐助, 鸣人]
{鸣人=下忍, 佐助=下忍}
{鸣人=下忍, 佐助=下忍}
4.stream增强
Stream是Java 8 中的特性,在Java 9 中为其新增了4个方法
ofNullable(T t):此方法可以接收null来创建一个空流
public static void nullTest(){
// 以前
// Stream.of(null); //报错
// 现在
Stream.ofNullable(null);
}
此方法根据Predicate接口来判断如果为true就 取出 来生成一个新的流,只要碰到false就终止,不管后边的元素是否符合条件。
此方法根据Predicate接口来判断如果为true就 丢弃 来生成一个新的流,只要碰到false就终止,不管后边的元素是否符合条件。public static void streamTest(){
var upList = List.of( "鸣人", "佐助", "小樱" );
// 从集合中依次删除满足条件的元素,直到不满足条件为止
var upListSub1 = upList.stream()
.dropWhile( item -> item.equals("鸣人") )
.collect( Collectors.toList() );
System.out.println(upListSub1); // 打印 [佐助, 小樱]
// 从集合中依次获取满足条件的元素,知道不满足条件为止
var upListSub2 = upList.stream()
.takeWhile( item -> item.equals("鸣人") )
.collect( Collectors.toList() );
System.out.println( upListSub2 ); // 打印 [鸣人]
}
[佐助, 小樱]
[鸣人]public static void iterateTest(){
// 以前使用iterate方法生成无限流需要配合limit进行截断
Stream
12345
678910
Process finished with exit code 0
stream()
如果为空返回一个空流,如果不为空将Optional的值转成一个流。public static void streamTest(){
//返回Optional值的流
Stream
Java 11
ifPresentOrElse 方法的用途是,如果一个 Optional 包含值,则对其包含的值调用函数 action,即 action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse 还有第二个参数 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction,即 emptyAction.run()。public static void ifPresentOrElseTest(){
Optional
Value: 1
Not Present.
不是很懂这个是干啥的,但大概意思应该是有值就输出改值,否则输出提示信息。public static void orTest(){
Optional
Files类增强
Files类的静态方法writeString()和readString(),把文件内容读取到String以及String回写到文:public static void filesTest() throws IOException {
Path path = Paths.get("D:/test.txt");
Files.writeString( path, "刺客五六七", StandardCharsets.UTF_8 );
String content = Files.readString(path, StandardCharsets.UTF_8);
System.out.println(content);
}
测试结果:
刺客五六七
InputStream则增加了一个transferTo()方法,直接将数据丢到OutputStream去:public static void transferToTest(){
try {
InputStream inputStream = new FileInputStream("D:/test.txt");
OutputStream outputStream = new FileOutputStream("D:/test2.txt");
inputStream.transferTo(outputStream);
} catch (Exception e){
e.printStackTrace();
}
}
JDK官方就自带HTTP Client了,位于java.net.http包下,支持发送同步、异步的HTTP
同步public static void visitWeb() throws IOException, InterruptedException {
var request = HttpRequest.newBuilder()
.uri( URI.create("https://www.baidu.com/") )
.GET()
.build();
// 同步请求方式,拿到结果前会阻塞当前线程
var httpResponse = HttpClient.newHttpClient()
.send( request, HttpResponse.BodyHandlers.ofString());
System.out.println( httpResponse.body() ); // 打印获取到的网页内容
}
异步public static void asynchronous() throws ExecutionException, InterruptedException {
var request = HttpRequest.newBuilder()
.uri( URI.create("https://www.baidu.com/") )
.GET()
.build();
CompletableFuture
携带JWT Token权限信息去请求public static void jwtToken() throws IOException, InterruptedException {
var requestWithAuth = HttpRequest.newBuilder()
.uri( URI.create("https://www.baidu.com/") )
.header("Authorization", "Bearer xxxxxxxxxxxxxx")
.GET()
.build();
var response = HttpClient.newHttpClient()
.send( requestWithAuth, HttpResponse.BodyHandlers.ofString() );
System.out.println( response.body() ); // 打印获取到的接口返回内容
}
以前要运行一个.java文件,首先要javac编译成.class文件,然后在java执行:
//编译
javac Java11.java
//运行
复制代码在java11中,只需要通过java一个命令就可以搞定
java Java11.java