本地變量類型推斷
public class Client {
public static void main(String[] args) {
var name = "lisi";
System.out.println(name);
List<String> names = Arrays.asList("a", "b", "c");
for (var s : names) {
System.out.println(s);
}
for (var i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}
}
}
編譯器會根據右邊的表達式自動推斷左邊的類型,
var name = "lisi";
String name = "lisi";
這兩個聲明是一樣的。
字符串增強
之前版本的字符串是使用字符數組存儲的,新版本換成了字節數組存儲,增加了一些新方法
public class Client {
public static void main(String[] args) {
// 判斷是否為空白
System.out.println(" ".isBlank());
// 去除左邊和右邊的空白
System.out.println(" lisi ".strip().length());
// 去除左邊的空白
System.out.println(" lisi ".stripLeading().length());
// 去除右邊的空白
System.out.println(" lisi ".stripTrailing().length());
// 重復字符串
System.out.println("lisi".repeat(3).length());
// 行數統計
System.out.println("lisi\nlisi\n".lines().count());
}
}
集合增強
List,Set,Map都添加了of和copyOf方法來創建不可變的集合。
public class Client {
public static void main(String[] args) {
List<String> list = List.of("AAA", "BBB");
List<String> copyList = List.copyOf(list);
System.out.println(list == copyList); // true
List<String> a = Arrays.asList("a");
System.out.println(List.copyOf(a) == a); // false
Set<String> set = Set.of("AAA", "BBB");
Set<String> copySet = Set.copyOf(set);
System.out.println(copySet == set);
Map<String, Object> map = Map.of("name", "lisi", "age", 23);
System.out.println(Map.copyOf(map) == map);
System.out.println(Arrays.toString(list.toArray(String[]::new)));
}
}
copyOf的實現原理
// make a copy, short-circuiting based on implementation class
@SuppressWarnings("unchecked")
static <E> List<E> listCopy(Collection<? extends E> coll) {
if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
return (List<E>)coll;
} else {
return (List<E>)List.of(coll.toArray());
}
}
如果已經是不可變集合,直接返回自身,否則返回一個新的不可變集合。
Collection 新加了一個默認方法toArray(IntFunction)
// JDK11之前
System.out.println(Arrays.toString(list.toArray(new String[0])));
// JDK11
System.out.println(Arrays.toString(list.toArray(String[]::new)));
Stream 增強
public class Client {
public static void main(String[] args) {
// null 就是空stream
System.out.println(Stream.ofNullable(null).count());
List<String> list = List.of("a", "b", "c");
// 截止到第一個不滿足條件的元素
list.stream().takeWhile(x -> x.equals("a")).forEach(System.out::println);
System.out.println("==========");
// 從第一個不滿足條件的元素開始
list.stream().dropWhile(x -> x.equals("a")).forEach(System.out::println);
System.out.println("==========");
// 迭代 直到不滿足條件
Stream.iterate(3, x -> x < 7, x -> x + 1).forEach(System.out::println);
}
}
Optional 增強
public class Client {
public static void main(String[] args) {
Optional.of("abc").or(() -> Optional.of("hello")).stream().forEach(System.out::println);
}
}
增加了or(Supplier<? extends Optional<? extends T>>)和stream()方法
InputStream 增強
public class Client {
public static void main(String[] args) {
try {
try (InputStream is = Client.class.getClassLoader().getResourceAsStream("html.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
is.transferTo(baos);
System.out.println(new String(baos.toByteArray()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
增加了transferTo(OutputStream) 方法,將數據輸出到OutputStream。
Http Client API
public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
// 創建http客戶端
HttpClient client = HttpClient.newHttpClient();
// 創建GET請求
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("https://www.baidu.com"))
.build();
// 同步發送請求
System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
System.out.println("============");
// 異步發送請求
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
// 創建POST請求
HttpRequest postRequest = HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/post"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(JSON.toJSONString(Map.of("method", "POST"))))
.build();
System.out.println(client.send(postRequest, HttpResponse.BodyHandlers.ofString()).body());
}
}
java 命令編譯運行源碼
java Client.java
一個命令編譯加運行