本文共 7258 字,大约阅读时间需要 24 分钟。
官方提供的新特性列表:
或参考 Open JDK
在线Oracle JDK 9 Documentation:
谈到 Java 9 大家往往第一个想到的就是 Jigsaw 项目。众所周知,Java 已经 发展超过 20 年(95 年最初发布),Java 和相关生态在不断丰富的同时也越 来越暴露出一些问题:
本质上讲也就是说,用模块来管理各个package,通过声明某个package 暴露,,模块(module)的概念,其实就是package外再裹一层,不声明默 认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪 些部分可以暴露,哪些部分隐藏
实现目标module java9test { //package we export exports com.atguigui.bean; }
exports: 控制着哪些包可以被其它模块访问到。所有不被导出的包默认 都被封装在模块里面
module java9demo { requires java9test;}
requires: 指明对其它模块的依赖。
1.产生背景
像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print loop) 了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码, 就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,必须创建文 件、声明类、提供测试方法方可实现。2.设计理念
即写即得、快速运行3.实现目标
我们将能够与匿名实现类共同使用钻石操作符(diamond operator) 在Java 8 中如下的操作是会报错的,Java 9中如下操作可以正常执行通过
Comparator
编译报错信息:Cannot use “<>” with anonymous inner classes.
Java 8 中,可以实现资源的 自动关闭 ,但是要求执行后必须关闭的所有资源必 须在try子句中初始化,否则编译不通过。如下例所示
try(InputStreamReader reader = new InputStreamReader(System.in){ //读取数据细节省略 }catch (IOException e){ e.printStackTrace(); }
Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始 化过的资源,此时的资源是final的
InputStreamReader reader = new InputStreamReader(System.in); OutputStreamWriter writer = new OutputStreamWriter(System.out); try (reader; writer) { //reader是final的,不可再被赋值 //reader = null; //具体读写操作省略 } catch (IOException e) { e.printStackTrace(); }
结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约 了一些空间
public final class String implements java.io.Serializable, Comparable, CharSequence { @Stable private final byte[] value; }
那StringBuffer 和 StringBuilder 是否仍无动于衷呢?
String-related classes such as AbstractStringBuilder, StringBuilder, and StringBuffer will be updated to use the same representation, as will the HotSpot VM‘s intrinsic(固有的、内置的) string operations.要创建一个只读、不可改变的集合,必须构造和分配它,然后添加元素,最后 包装成一个不可修改的集合
ListnamesList = new ArrayList <>(); namesList.add("Joe"); namesList.add("Bob"); namesList.add("Bill");namesList = Collections.unmodifiableList(namesList); System.out.println(namesList);
缺点:我们一下写了五行。即:它不能表达为单个表达式
Listlist = Collections.unmodifiableList(Arrays.asList("a", "b", "c")); Set set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c"))); // 如下操作不适用于jdk 8 及之前版本,适用于jdk 9 Map map = Collections.unmodifiableMap(new HashMap<>() { { put("a", 1); put("b", 2); put("c", 3); } }); map.forEach((k, v) -> System.out.println(k + ":" + v));
List firsnamesList = List.of(“Joe”,”Bob”,”Bill”); 调用集合中静态方法of(),可以将不同数量的参数传输到此工厂方法中。此功能 可用于Set和List,也可用于Map的类似形式。此时得到的集合,是不可变的:在 创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。 由于Java 8中接口方法的实现,可以直接在List,Set和Map的接口内定义这些方法, 便于调用
Listlist = List.of("a", "b", "c"); Set set = Set.of("a", "b", "c");Map map1 = Map.of("Tom", 12, "Jerry", 21, "Lilei", 33, "HanMeimei", 18);Map map2 = Map.ofEntries(Map.entry("Tom", 89), Map.entry("Jim", 78), Map.entry("Tim", 98));
InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接 传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下 示例
ClassLoader cl = this.getClass().getClassLoader(); try (InputStream is = cl.getResourceAsStream("hello.txt"); OutputStream os = new FileOutputStream("src\\hello1.txt")) { is.transferTo(os); // 把输入流中的所有数据直接自动地复制到输出流中 } catch (IOException e) { e.printStackTrace(); }
用于从 Stream 中获取一部分数据,接收一个 Predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素
Listlist = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88); list.stream().takeWhile(x -> x < 50).forEach(System.out::println);System.out.println();list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); list.stream().takeWhile(x -> x < 5).forEach(System.out::println);
dropWhile 的行为与 takeWhile 相反,返回剩余的元素
Listlist = Arrays.asList(45, 43, 76, 87, 42, 77, 90, 73, 67, 88); list.stream().dropWhile(x -> x < 50).forEach(System.out::println); System.out.println(); list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); list.stream().dropWhile(x -> x < 5).forEach(System.out::println);
Java 8 中 Stream 不能完全为null,否则会报空指针异常。而 Java 9 中的 ofNullable 方 法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空 Stream
// 报NullPointerException // Stream
这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什 么时候结束迭代
// 原来的控制终止方式: Stream.iterate(1, i -> i + 1).limit(10).forEach(System.out::println); // 现在的终止方式: Stream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
Optional类中stream()的使用
Listlist = new ArrayList<>(); list.add("Tom"); list.add("Jerry"); list.add("Tim");Optional
> optional = Optional.ofNullable(list); Stream
> stream = optional.stream(); stream.flatMap(x -> x.stream()).forEach(System.out::println);
转载地址:http://ptuki.baihongyu.com/