112.java基础21(java11新特性回顾)

1.JShell

最低java9 jdk; 并配置环境变量
cmd 中启动 jshell 进入 命令行,可以直接执行java代码,不需要编译
/help  帮助界面

2.局部变量类型推断:

List<interger> list = new ArrayList<>();  
list.add("abc");  // 不能添加,转化不了Integer
var a = "abc"; == String a = "abc";

var b = new StringBuffer("123");
var a = new ArrayList<Integer>();

System.out.println(a.getClass()); // class java.util.ArrayList

var n; 无法推断类型,不能这样使用,同时类的属性的数据类型不可以使用var
    
Thread t = new Thread(()->Systeom.out.println(Thread.currentThread().getName()));
t.start();

有参数的lambda表达式使用
函数式接口:
	Consumer<T>: 消费型函数式接口
        public void accept(T t):
    Counsumer<String> consumer = t -> Systeom.out.println(t.toUpperCase());
	Counsumer<String> consumer = (var t) -> Systeom.out.println(t.toUpperCase());
	
 	Counsumer<String> consumer = (@Nullnull/Deprecated var t) -> Systeom.out.println(t.toUpperCase()); // 可以给变量加注解,没有用var声明不能加注解

3.集合中的一些增强的API:

package com.atguigu.java11;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import org.junit.Test;
public class APITest {
	// 集合中的一些增强的API
	@Test
	public void test3() {
		LocalDate localDate = LocalDate.of(2019, 1, 21);
		// 在添加重复元素时, 不是无法添加, 而是抛出异常
		//Set<Integer> set = Set.of(100, 50, 20, 30, 10, 8, 100, 8);
		Set<Integer> set = Set.of(100, 50, 20, 30, 10, 8);
		System.out.println(set.getClass());
		Stream<Integer> stream = Stream.of(50, 20, 30, 70);
	}
	@Test
	public void test2() {
		//快速创建数组
		int[] arr = {1, 9, 3, 2, 8};
		// 快速把数据变成集合的方法
		List<String> list1 = Arrays.asList("aa", "yyy", "zzz", "123");
		//list1.add("ppp"); // 是一个不可以添加元素的集合
		// 集合的创建可以使用更简单的方式
		List<String> list2 = List.of("aa", "bbb", "cc", "DD");
		System.out.println(list2);
		//list2.add("yyy"); // 不可以添加元素
		System.out.println(list2);
	}
	@Test
	public void test1() {
		List<String> list = new ArrayList<>();
		list.add("aa");
		list.add("bbb");
		list.add("cc");
		list.add("DD");
		System.out.println(list);
	}
}

4.Stream 加强:

package com.atguigu.java11;

import java.util.stream.Stream;

import org.junit.Test;

/**
 * 流的处理
 * 1) 创建流
 * 2) 中间操作
 * 3) 终止操作
 */

public class StreamTest {
	
	@Test
	public void test3() {
		// 流的迭代, 创建流
		Stream<Integer> stream1 = Stream.iterate(1, t -> (2 * t) + 1);
		stream1.limit(10).forEach(System.out::println);
		
		System.out.println("*************************");
		// 有限的迭代
		Stream<Integer> stream2 = Stream.iterate(1, t -> t < 1000, t -> (2 * t) + 1);
		stream2.forEach(System.out::println);
	}
	
	@Test
	public void test2() {
		Stream<Integer> stream1 = Stream.of(3, 9, 20, 22, 40, 7);
		// 新方法, takeWhile, dropWhile
		// 从流中一直获取判定器为真的元素, 一旦遇到元素为假, 就终止处理.
		Stream<Integer> stream2 = stream1.takeWhile(t -> t % 2 != 0);
		stream2.forEach(System.out::println); // 输出 3,9
		System.out.println("**********************");
		stream1 = Stream.of(3, 9, 20, 22, 40, 7);
		Stream<Integer> stream3 = stream1.dropWhile(t -> t % 2 != 0);
		stream3.forEach(System.out::println); //输出 20,22,40,7
		
	}
	
	@Test
	public void test1() {
		Stream<Integer> stream1 = Stream.of(3, 9, 20, 22, 40);
		//stream1.forEach(t -> System.out.println(t));
		stream1.forEach(System.out::println);
		
		System.out.println("***********************************");
		
		Stream<Object> stream2 = Stream.of(); // 流中没有数据
		stream2.forEach(System.out::println);
		
		System.out.println("***********************************");
		
		// 传入null会被解析为是一个数组对象, 会进一步访问它的长度信息
		//Stream<Object> stream3 = Stream.of(null);
		//stream3.forEach(System.out::println);
		
		// 可以传入 一个null来创建流对象
		Stream<Object> stream3 = Stream.ofNullable(null);
		stream3.forEach(System.out::println);
	}
}

5.string 字符串新增方法:

package com.atguigu.java11;

import static org.junit.Assert.*;

import java.io.FileInputStream;

import org.junit.Test;

public class StringTest {
	
	@Test
	public void testName3() throws Exception {
		FileInputStream fis = new FileInputStream("src/com/atguigu/java11/StringTest.java");
		byte[] buffer = new byte[fis.available()];// fis.available() 整个文件的字符数
		fis.read(buffer);
		fis.close();
		String string = new String(buffer);
		string.lines().forEach(System.out::println); // string.lines()是stream流
	}
	
	@Test
	public void testName2() throws Exception {
		String string = "Java";
		String string2 = string.repeat(5); //复制五次
		System.out.println(string2); // JavaJavaJavaJavaJava
	}

	@Test
	public void testName() throws Exception {
		String string = " 	  
 ";
		System.out.println(string.isBlank()); // 判断字符串中的字符是否都是空白
		
		System.out.println("**************************");
		
		string = " 	  
 abc 	 ";
		String string2 = string.strip(); // 去重字符串首尾的空白, 包括英文和其他所有语言中的空白字符
		System.out.println(string2);
		System.out.println(string2.length());
		
		String string3 = string.trim(); // 去重字符串首尾的空白字符, 只能去除码值小于等于32的空白字符
		System.out.println(string3);
		System.out.println(string3.length());
		
		System.out.println("**************************");
		String string4 = string.stripLeading(); // 去重字符串首部的空白
		System.out.println(string4);
		System.out.println(string4.length());
		
		String string5 = string.stripTrailing(); // 去重字符串尾部的空白
		System.out.println(string5);
		System.out.println(string5.length());
	}
}	

6.Optional 加强:

package com.atguigu.java11;

import static org.junit.Assert.*;
import java.util.Optional;
import org.junit.Test;

public class OptionalTest {
	@Test
	public void testName() throws Exception {
		// of方法中如果传入的参数是null, 会抛出空指针异常
		//Optional<String> optional = Optional.of(null);
		// ofNullable可以兼容空指针, 但是实际传入null后要小心
		Optional<Object> optional = Optional.ofNullable(null);
		Object object = optional.orElse("abc"); // 如果内部引用为空, 则返回参数中的引用, 否则返回内部引用: 打印abc
		System.out.println(object);
		
		Object object2 = optional.orElseThrow();
		System.out.println(object2);
	}
}

7.流自动文件复制:

package com.atguigu.java11;

import static org.junit.Assert.*;
import java.io.FileOutputStream;
import org.junit.Test;

public class InputStreamTest {
	@Test
	public void testName() throws Exception {
		var cl = this.getClass().getClassLoader();
		try (var is = cl.getResourceAsStream("file"); var os = new FileOutputStream("file2")) {
			is.transferTo(os); // 把输入流中的所有数据直接自动地复制到输出流中
		}
	}
}

8.HTTPClient:

package com.atguigu.java11;

import static org.junit.Assert.*;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandler;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.concurrent.CompletableFuture;

import org.junit.Test;

public class HTTPClientTest {
	
	@Test
	public void testName2() throws Exception {
		HttpClient client = HttpClient.newHttpClient();
		HttpRequest request = HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/test/")).build();
		BodyHandler<String> responseBodyHandler = BodyHandlers.ofString();
		CompletableFuture<HttpResponse<String>> sendAsync = client.sendAsync(request, responseBodyHandler);
		sendAsync.thenApply(t -> t.body()).thenAccept(System.out::println);
		//HttpResponse<String> response = sendAsync.get();
		//String body = response.body();
		//System.out.println(body);
		
	}
	
	@Test
	public void testName() throws Exception {
		HttpClient client = HttpClient.newHttpClient();
		HttpRequest request = HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/test/")).build();
		BodyHandler<String> responseBodyHandler = BodyHandlers.ofString();
		HttpResponse<String> response = client.send(request, responseBodyHandler);
		String body = response.body();
		System.out.println(body);
	}
}

9.增强java启动器:

增强java启动器支持运行单个java源代码文件的程序.

注意点 :
1)执行源文件中的第一个类, 第一个类必须包含主方法
2)并且不可以使用别源文件中的自定义类, 本文件中的自定义类是可以使用的.

一个命令编译运行源代码
看下面的代码。
// 编译
javac Javastack.java
// 运行
java Javastack
在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示。
java Javastack.java

10.新的Epsilon垃圾收集器:

package com.atguigu.java11;

import java.util.ArrayList;
import java.util.List;

class Garbage {
	
	private double d1 = 1;
	private double d2 = 2;
	
	// 这个方法是GC在清除本对象时, 会调用一次
	@Override
	public void finalize() {
		System.out.println(this + " collecting");
	}
}

public class EpsilonTest {
	
	// 执行: -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
	public static void main(String[] args) {
		List<Garbage> list = new ArrayList<>();
		boolean flag = true;
		int count = 0;
		while (flag) {
			list.add(new Garbage());
			if (count++ == 500) {
				list.clear();  // 将前五百个设置为垃圾对象,等待gc回收,之后创建的将不再进行回收,这个时候会导致内存溢出
			}
		}
	}
}
主要用途如下 :
	性能测试(它可以帮助过滤掉GC引起的性能假象)
	内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃)
	非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间)
	VM接口测试
	Last-drop 延迟&吞吐改进

11.zgc:

这个东西还是实验性质的,暂时可以做测试使用

// linux 64位中可以使用
package com.atguigu.java11;
import java.util.ArrayList;
import java.util.List;
public class ZGCTest {
	//  执行: -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
	public static void main(String[] args) {
		List<Garbage> list = new ArrayList<>();
		boolean flag = true;
		int count = 0;
		while (flag) {
			list.add(new Garbage());
			if (count++ % 500 == 0) {
				list.clear();
			}
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

原文地址:https://www.cnblogs.com/liuzhanghao/p/13958319.html