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();
        }
    }
}

posted @ 2021-08-17 23:26  纵不朽  阅读(162)  评论(0编辑  收藏  举报