Java11 正式发布了, 让你的代码更完美?
主题互动
Java11 已经发布了, 我们今天聊聊大家还停留在哪个版本呢? 大家对于新版本的迅速的发布有什么想说的呢?
09 月 25 日, Oralce 正式发布了 Java 11, 这是据 Java 8 以后支持的首个长期版本.
我们都知道, 前面的几个版本都不是长期支持的, 然而, 现在发布这个最新的长期支持的版本还是非常有意义的.
Java11 也有许多的地方增加了新的功能, 当然, 也有一些功能删除了.
下面这是 java 版本的发布日期:
java11 也从下面的这些地方更新(下面是官网的截图)
因为 Java11 已经把 Java9 和 Java10 的一些功能也集成到了 Java11 中, 所以, 下面我们从一些新的功能介绍一下.
Java 9 -11 引入的新语法和 API
本地变量类型推断
Java 10 就已经引入了新关键词 var, 该关键词可以在声明局部变量的时候替换类型信息. 本地 (local) 是指方法内的变量声明.
Java 10 之前, 你需要这样声明一个 String 对象.
String str="hello java 9";
在 Java10 里头可以使用 var 替代 String, 表达式变成这样:
var str="hello java 10";
用 var 声明的变量仍然是静态类型的. 不兼容的类型无法重新分配给此类变量. 此代码段无法编译:varstr="hello java 11";
str=11;//Incompatible types
当编译器无法推断出正确的变量类型时, 也不允许使用 var. 以下所有代码示例都会导致编译器错误:// Cannot infer type:
vara;
varnothing=null;
varlambda=()->System.out.prinltn("Pity!");
varmethod=this::someNethod;
局部变量类型推断可以泛型. 在下一个示例中, Map 类型, 可以将其简化为单个 var 关键字, 从而避免大量样板代码:varmyList=newArrayList>>();
for(varcurrent:myList)
{
//Current is infered to type:Map>
System.out.println(current);
}
从 Java 11 开始, lambda 参数也允许使用 var 关键字:
Predicatepredicate = (@Nullable var a)->true;
HTTP Client
Java 9 开始引入 HttpClient API 来处理 HTTP 请求. 从 Java 11 开始, 这个 API 正式进入标准库包( http://java.NET ). 让我们来探索一下我们可以用这个 API 做些什么.
新的 HttpClient 可以同步或异步使用. 同步请求会阻止当前线程. BodyHandlers 定义响应体的预期类型(例如, 字符串, 字节数组或文件):varrequest=HttpRequest.newBuilder()
.uri(URI.create("https://winterbe.com"))
.GET()
.build();
varclient=HttpClient.newHttpClient();
HttpResponseresponse=client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
也可以使用异步来执行相同的请求. 调用 sendAsync 不会阻止当前线程, 而是返回 CompletableFuture 来进行异步操作.varrequest=HttpRequest.newBuilder()
.uri(URI.create("https://winterbe.com"))
.build();
varclient=HttpClient.newHttpClient();
client.sendAsync(request,HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
我们可以省略. GET(), 因为它是默认的请求方法.
下一个示例通过 POST 将数据发送到给定的 URL. 与 BodyHandler 类似, 您使用 BodyPublishers 定义作为请求主体发送的数据类型, 如字符串, 字节数组, 文件或输入流:varrequest=HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/post"))
.header("Content-Type","text/plain")
.POST(HttpRequest.BodyPublishers.ofString("Hi there!"))
.build();
varclient=HttpClient.newHttpClient();
varresponse=client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());// 200
最后一个例子演示了如何通过 BASIC-AUTH 执行授权:varrequest=HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/basic-auth"))
.build();
varclient=HttpClient.newBuilder()
.authenticator(newAuthenticator(){
@Override
protectedPasswordAuthenticationgetPasswordAuthentication(){
returnnewPasswordAuthentication("postman","password".toCharArray());
}
})
.build();
varresponse=client.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());// 200
Collections
List,Set 和 Map 等集合已经用新方法扩展. List.of 从给定的参数创建了一个新的不可变列表. List.copyOf 创建列表的不可变副本.varlist=List.of("A","B","C");
varcopy=List.copyOf(list);
System.out.println(list==copy);// true
因为 list 已经是不可变的, 所以实际上不需要实际创建 list 实例的副本, 因此 list 和副本是相同的实例. 但是, 如果你复制一个可变 list, 那么复制确实会生成一个新实例, 因此保证在改变原始 list 时没有副作用:varlist=newArrayList();
varcopy=List.copyOf(list);
System.out.println(list==copy);// false
创建不可变 map 时, 您不必自己创建 map 条目, 而是将键和值作为参数传递:varmap=Map.of("A",1,"B",2);
System.out.println(map);// {
B=2,A=1
}
Java 11 中的不可变集合仍然使用 Collection API 中的老接口. 但是, 如果尝试修改不可变集合, 则会抛出 java.lang.UnsupportedOperationException. 可喜的是, 如果尝试改变不可变集合, Intellij IDEA 会通过发出警告.
Streams
Streams 是在 Java 8 中引入的, Java 9 增加了三个新方法. 单个参数构造方法:Stream.ofNullable(null)
.count()// 0
增加 takeWhile 和 dropWhile 方法, 用于从 stream 中释放元素:Stream.of(1,2,3,2,1)
.dropWhile(n->n<3)
.collect(Collectors.toList());// [3, 2, 1]
Stream.of(1,2,3,2,1)
.takeWhile(n->n<3)
.collect(Collectors.toList());// [1, 2]
如果对 Stream 不熟, 可以参考这篇文章[1].
Optionals
Optionals 提供了一些非常方便的功能, 例如 您现在可以简单地将 Optional 转换为 Stream, 或者为空 Optinal 提供另一个 Optional 作为备胎:Optional.of("foo").orElseThrow();// foo
Optional.of("foo").stream().count();// 1
Optional.ofNullable(null)
.or(()->Optional.of("fallback"))
.get();// fallback
Strings
Java11 给 String 增加了一些辅助方法来修剪或检查空格等功能:" ".isBlank();// true
"Foo Bar".strip();// "Foo Bar"
"Foo Bar".stripTrailing();// "Foo Bar"
"Foo Bar".stripLeading();// "Foo Bar"
"Java".repeat(3);// "JavaJavaJava"
"A\nB\nC".lines().count();// 3
InputStreams
InputStream 增加了 transferTo 方法, 可以用来将数据直接传输到 OutputStream:varclassLoader=ClassLoader.getSystemClassLoader();
varinputStream=classLoader.getResourceAsStream("myFile.txt");
vartempFile=File.createTempFile("myFileCopy","txt");
try(varoutputStream=newFileOutputStream(tempFile)){
inputStream.transferTo(outputStream);
}
这些上面的新特性只是在前面几个版本有的, 或者一些比较觉得不错的新特性, 如果还想去了解更多的新特性可以去官网查看
来源: https://juejin.im/post/5bb37b3ce51d450e76333047