可能很多人现在 Java8 的新特性还没用熟呢,Java 11 就已经来了,下面一起来看下 Java 11 的几个新特性:
var 类型
Strings 的几个便利方法
集合的便利方法
Streams
InputStreams
HTTP Client
Java 10 引入一个新的关键字 var
,当声明本地变量时可以替代类型信息(“本地变量”指的是方法体中声明的变量)。
在 Java 10 以前,声明变量是这样的:
String text = "Hello Java 9";
现在可以使用 var
代替 String
,编译器会自动推断出准确的类型,在上面的代码中 text
就是 String
类型:
var text = "Hello Java 10";
需要注意,使用 var
可不表示动态类型,还是静态的,类型是不能重新改变的,例如下面的用法就是无法编译的:
var text = "Hello Java 11";
text = 23; // 无法编译
而且,变量的类型不明确时是不能使用 var
声明的,例如下面的代码就是错误的:
var a;
var nothing = null;
var lambda = () -> System.out.println("Pity!");
var method = this::someMethod;
那么 var
有什么好处呢?我感觉它最大的好处就是简化代码,例如:
var myList = new ArrayList<Map<String, List<Integer>>>();
for (var current : myList) {
System.out.println(current);
}
current
的类型就是 Map<String,List<Integer>>
,是不是简单了不少。
" ".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
List
、 Set
和 Map
都有了新的方法。
List.of
可以根据给定的参数创建一个不变列表, List.copyOf
可以创建一个不变列表的复本。
var list = List.of("A", "B", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
因为 list
是 List.of
创建出来的不变列表,已经是不变的了,那么没必要再创建一个实例,所以 list
和 copy
是同一个实例。但如果要 copy 一个可变的列表, copy
就是一个真实的实例:
var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy); // false
Map.of
可以创建一个不变的Map:
var map = Map.of("A", 1, "B", 2);
System.out.println(map); // {B=2, A=1}
Streams 是 Java 8 引入的,现在有了3个新的方法:
// ofNullable
Stream.ofNullable(null)
.count() // 0
// dropWhile
Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1]
// takeWhile
Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]
InputStream 有了一个非常方便的方法,可以直接传输数据到 OutputStream,例如:
var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("myFile.txt");
var tempFile = File.createTempFile("myFileCopy", "txt");
try (var outputStream = new FileOutputStream(tempFile)) {
inputStream.transferTo(outputStream);
}
Java 9 引入了 HttpClient
API,在 Java 11 中终于可用了,在 java.net
包下。
HttpClient
可以同步,也可以异步。
同步方式:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://winterbe.com"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// BodyHandlers 定义响应体的期望类型,例如 string、byte-array、file
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
异步方式:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://winterbe.com"))
.build();
var client = HttpClient.newHttpClient();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
POST请求:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/post"))
.header("Content-Type", "text/plain")
.POST(HttpRequest.BodyPublishers.ofString("Hi there!"))
.build();
var client = HttpClient.newHttpClient();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200
BASIC-AUTH 认证:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/basic-auth"))
.build();
var client = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("postman", "password".toCharArray());
}
})
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200
本文翻译整理自:
https://winterbe.com/posts/2018/09/24/java-11-tutorial/
先介绍这些,以后发现好用新特性时再分享。
点击下面的 “阅读原文” 查看 历史文章列表