01.Jshell(java9开始支持)

可以快捷的执行代码。不需要写类。可以用来测试。 在bin目录里面有 jshell.exe。 配置好环境变量以后。在cmd用jshell可以打开shell,里面可以直接运行java代码(jshell相当与直接进入了main方法)。操作步骤如下

  1. jshell
  2. 直接在里面写代码

image.png
在里面写类
image.png
使用 /help 呼出jshell的帮助文档

02. Dynamic Class-File Constants类文件新增的一种结构

作用:对类的格式的扩展

03. 局部变量的类型推断(var 关键字)

var 语法: 局部变量的类型推断

注意点:

  • var a; 这样不可以,因为无法推断
  • 类中的属性不能使用var来定义。
    1. var a = "hello world";
    2. // 等价于
    3. String a = "Hello world";

有参数的lambda表达式使用

函数式接口在说明var在lambda中的使用
Consumer : 消费型函数时接口
public void accept(T t);

Consumer<String> consumer = t -> System.out.print(t.toUpperCase());

Consumer<String> consumer = (var t) -> System.out.print(t.toUpperCase());

// 这个注解要求传入的字符串不能为空
Consumer<String> consumer = (@Nonnull var t) -> System.out.print(t.toUpperCase());

// 使用
consumer.accept("fdsfsdfdsfs");

04. 新添加的API

集合中增强的API

// 集合的创建可以使用更简单的方式
List<String> list = List.of("aa","bb","cc","dd");  
// 但是此list不能add元素,源码中父类的接口直接在add方法中throw了异常。
System.out.print(list); 

// Set集合和Stream流中也有of方法,可以用来创建set的集合

Stream流中的增强API

ofNullable 方法

流处理的三个步骤

  1. 创建
  2. 中间操作
  3. 终止处理,代码如下 ```java Stream stream1 = Stream.of(3,4,5,6,2,1,5,9); stream1.forEach(System::println);

Stream stream1 = Stream.of(); stream1.forEach(System::println); // 打印出空数据

Stream stream1 = Stream.of(null); stream1.forEach(System::println); // nullPointer异常

// 为避免上面情况 11版本追加了 ofNullabel Stream stream1 = Stream.ofNullable(null); stream1.forEach(System::println); // 打印出空数据

<a name="66Rov"></a>
### takeWhile/dropWhile 方法
```java
Stream<Integer> stream1 = Stream.of(3,4,5,6,2,1,5,9);
// 新方法 takeWhile 
Stream<Integer> stream2 = stream1.takeWhile(t -> t/2 == 0); // 从流中获取判定器为真的元素,返回,一旦盘点为假,就会退出,流后面的元素不会继续判定
stream2.forEach(System::println);  // 打印出空数据

Stream<Integer> stream1 = Stream.of(3,4,5,6,2,1,5,9);
// 新方法 dropWhile
Stream<Integer> stream2 = stream1.dropWhile(t -> t/2 == 0); // 从流中舍去判定器为真的元素,一旦盘点为假,就会推出,流后面的元素不会继续判定
stream2.forEach(System::println);  // 打印出空数据

流的迭代 iterate产生有限流

// 以前的回产生无限流
Stream<Integer> stream1 = Stream.iterate(1, t -> (2*t)+1 ); // 第一个参数是初始值, 第二个参数是对第一个参数进行的运算
stream2.forEach(System::println);  // 打印出无限的数字,超过边界后打印-1

// java11
Stream<Integer> stream1 = Stream.iterate(1, t -> t<1000,t -> (2*t)+1 ); // 第一个参数是初始值, 第二个参数是对运算的结果进行判断, 第三个参数是对第一个参数进行的运算
stream2.forEach(System::println);  // 打印出无限的数字,超过边界后打印-1

字符串新添加的方法

// isBlank判断是不是空白
String str = "\t   \r\n";
System.out.print(str.isBlank());   // true

// 去除空白strip 此方法优于trim的是,不仅可以去除英文的空白,其他各种语言的空白也能去除,比如中文日文的全角空格
String str = "\t   \r\n";
String str1 = str.strip();            // stripLeading 去除字符串首部的空白   stripTrailing 去尾部
System.out.print(str1.length());   // 0

// 字符串重复
String string = "java";
String str = string.reprat(3);  // "javajavajava"

// 行数统计
"fdsfds".lines.count();

Optional增强

// of方法中如果传入参数是null会抛出空指针异常
Optional<String> = Optional.of(null);  // nullPointer

// ofNullable可以兼容null,但使用的时候也要小心
Optional<String> = Optional.ofNullable(null); 
Object object = optional.orElse("123");
System.out.print(object);

// orElseThrow
Optional<String> = Optional.ofNullable(null); 
Object object = optional.orElseThrow(); // 抛出 noSuchElementException

InputStream 改进

transferTo方法,可以用来将数据直接传输到OutputStream

// 把输入流中的数据复制到输出流中
var c1 = this.getClass().getClassLoader();
var is = c1.getResourceAsStream("file");
try(var os = new FileOutputStream("file2")){
    is.transferTo(os);
}
is.close();

Http Client增强

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URL.create("ip address")).build();
BodyHandler<T> responseBodyHandler = BodyHandlers.ofString();
HttpResponse<String> response = client.send(request, responseBodyHandler);  // 同步请求
String body = response.body();
System.out.print(body);

05. 更简化的编译运行程序

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

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

之前进行编译运行的时候必须要用 javac /java
现在只需要java命令就行了,并且不会产生字节码文件

06. Unicode10

增加了8515个字符。总计到了136690个字符

07. Epsilon垃圾收集器