java 1_Java11 正式发布了, 让你的代码更完美?

Java11 正式发布了, 让你的代码更完美?

主题互动

Java11 已经发布了, 我们今天聊聊大家还停留在哪个版本呢? 大家对于新版本的迅速的发布有什么想说的呢?

09 月 25 日, Oralce 正式发布了 Java 11, 这是据 Java 8 以后支持的首个长期版本.

我们都知道, 前面的几个版本都不是长期支持的, 然而, 现在发布这个最新的长期支持的版本还是非常有意义的.

Java11 也有许多的地方增加了新的功能, 当然, 也有一些功能删除了.

下面这是 java 版本的发布日期:

ab7653affab982b574eb7acc55df2e04.gif

java11 也从下面的这些地方更新(下面是官网的截图)

ab7653affab982b574eb7acc55df2e04.gif

ab7653affab982b574eb7acc55df2e04.gif

因为 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值