JDK9新特性
模块化
包级别上面加一个模块的级别
根目录下加一个module描述文件,可以指定export模块下面的包
其他模块在module描述文件中import指定的包,才可以引用该包下面的类
jShell
和Python等其他语言一样的命令行工具,可以在互动命令行中写代码
多版本兼容jar
同一个类,一个用老版本的API写,一个用新版本的API写,进行特殊打包后
老版本JDK的系统引入该jar包调用时,用的是老版本API写的类
新版本JDK的系统引入该jar包调用时,用的是新版本API写的类
接口可以定义私有方法
Java8中可以定义默认方法和静态方法,假设这几个方法有些逻辑是相同的,且这段逻辑是不希望对外暴露的,就可以使用接口的私有方法进行封装
钻石操作符使用升级
JDK7后:钻石操作符里的类型可以不写
List a = new ArrayList<>();
JDK9:新增一种写法
List a = new ArrayList<>(){
// 相当于new了一个ArrayList匿名子类
};
资源try的新写法
JDK7后:
try(InputStreamReader reader = new InputStreamReader(System.in)){
//读取数据
} catch(IOException e){
e.printStackTrace;
}
JDK9后:
InputStreamReader reader = new InputStreamReader(System.in);
OutputSteamWriter writer = new OutputStreamWriter(System.out);
try(reader;writer){
//reader和writer是不能再赋值的,隐式final
//读取数据
} catch(IOException e){
e.printStackTrace;
}
下划线
JDK9中标识符不能为 _
例子如下:
String _ = "444";//JDK9之后这样的变量名是不允许的
String底层存储结构由char数组改为byte数组+encodingFlag,StringBuffer和StringBuilder也是
创建只读集合
//jdk 8 以及之前:创建一个只读特点的集合
@Test
public void test1(){
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Jerry");
list.add("Lilei");
list.add("HanMeimei");
//调用Collections中的方法,将list变为只读的
List<String> newList = Collections.unmodifiableList(list);
// newList.add("Tim");//不能执行,否则报异常
//遍历:jdk 8
newList.forEach(System.out::println);
}
//jdk 8 以及之前:创建一个只读特点的集合
@Test
public void test2(){
//List:
List<Integer> list = Collections.unmodifiableList(Arrays.asList(1, 2, 3));
// list.add(4);
//Set:
Set<Integer> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1, 2, 3)));
// set.add(4);
// set.forEach(System.out::println);
//Map:
Map m = new HashMap<>();
m.put("Tom", 78);
Map<Object, Object> map = Collections.unmodifiableMap(m);
map.forEach((k,v) -> System.out.println(k + ":" + v));
}
//jdk 9 中:创建一个只读特点的集合
@Test
public void test3(){
//List:
List<Integer> list = List.of(1, 2, 3);
// list.add(4);
list.forEach(System.out::println);
//Set:
Set<Integer> set = Set.of(2, 3, 4);
// set.add(6);
//Map:
//创建只读集合的方式一:
Map<String, Integer> map = Map.of("Tom", 23, "Jerry", 22, "Lilei", 12, "HanMeimei", 18);
// map.put("Tim",33);
//创建只读集合的方式二:
Map<String, Integer> map1 = Map.ofEntries(Map.entry("Tom", 23), Map.entry("Jerry", 21));
// map1.put("Tim",33);
System.out.println(map1);
}
Stream新方法
//jdk 9 中针对于Stream 新添加了4个方法
//1.takeWhile()
@Test
public void test1(){
List<Integer> list = Arrays.asList(45,56,33,77,44,98,76,78,33);
// 输出第一个不满足之前的 所有符合的,不同于filter
list.stream().takeWhile(x -> x < 70).forEach(System.out::println);
System.out.println();
}
//2.dropWhile():与 takeWhile() 整好相反
@Test
public void test2(){
List<Integer> list = Arrays.asList(45,56,33,77,44,98,76,78,33);
Stream<Integer> stream = list.stream();
stream.dropWhile(x -> x < 70).forEach(System.out::println);
System.out.println();
List<Integer> list1 = Arrays.asList(1,2,3,4,5,6,7,8);
list1.stream().dropWhile(x -> x < 5).forEach(System.out::println);
}
//3.ofNullable(T t): t可以为null
@Test
public void test3(){
Stream<Integer> stream1 = Stream.of(1, 2, 3, null);
stream1.forEach(System.out::println);
System.out.println();
//如果只有单个元素,此元素不能为null.否则报NullPointerException
// Stream<Object> stream2 = Stream.of(null);
//jdk 9 :新增ofNullable(T t):
Stream<String> stream3 = Stream.ofNullable("Tom");
System.out.println(stream3.count());//1
Stream<String> stream4 = Stream.ofNullable(null);
System.out.println(stream4.count());//0
}
//4.iterator()重载的方法
@Test
public void test4(){
//复习:Stream的实例化:①通过集合的stream() ②通过数组工具类:Arrays ③ Stream中静态方法:of() ④iterator() / generate()
Stream.iterate(0,x -> x + 1).limit(10).forEach(System.out::println);
System.out.println();
// 新增新的iterate重载方法,下面的例子可以替代limit方法的作用
Stream.iterate(0,x -> x < 10,x -> x + 1).forEach(System.out::println);
}
Optional新增stream方法
//Optional类中提供了转换为Stream的方法:stream()
@Test
public void test1() {
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Jerry");
list.add("Tim");
Optional<List<String>> optional = Optional.ofNullable(list);
Stream<String> stream = optional.stream().flatMap(x -> x.stream());
// System.out.println(stream.count());
stream.forEach(System.out::println);
}
多分辨率图像API
新的HttpClient,且支持HTTP/2
package com.atguigu.java1;
import jdk.incubator.http.HttpClient;
import jdk.incubator.http.HttpRequest;
import jdk.incubator.http.HttpResponse;
import java.io.IOException;
import java.net.URI;
/**
* Created by songhongkang on 2017/12/29 0029.
*/
public class HttpClientTest {
public static void main(String[] args) {
//jdk 9 中 使用 HttpClient替换原有的HttpURLConnection
try {
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.atguigu.com")).GET().build();
HttpResponse<String> response = null;
response = client.send(req, HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.version().name());
System.out.println(response.body());
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}