Java9引入了module模块的概念,是类与接口和数据资源的一种封装,并可以声明与其他模块的依赖关系。这里总结一下Java9带来的新特性。

更简练的try-with-resources语句

  final Resource resource1 = new Resource("resource1");//a final resource
  Resource resource2 = new Resource("resource2");//An effectively final resource
  try(resource1;resource2){}//in Java7&8: try(Resource r1=resource1;Resources r2=resource2){}
  //@SafeVarargs可用于static、final、private方法,Iterator<String> i=new Iterator<>(){}钻石符号可用于匿名类,下划线不能再用于变量名
集合工厂方法增强
  List.of(E e1, E e2, E e3); //有多个重载方法,老版本:Arrays.asList(“a”,”b”);Stream.of(“a”,”b”).collect(toList())
  Set.of(E … elements); //of工厂方法创建的都是unmodifiable不可更改的集合,可使用new ArrayList(unmodifiable)再次包装
  Map.of(K k1, V v1, K k2, V v2); //ofEntries(Map.Entry<K,V> … entries),Map.entry(“K”,”V”)可以提供entryies参数
  //内部实现使用了wrapper对象,原始集合还是可以更改但不建议,unmodifiable集合可用于并行计算,避免很多场合下的集合复制,多个重载方法是为更好性能
进程ProcessHandle增强
  Process p=new ProcessBuilder(“notepad.exe”).start();//老版本:Runtime.getRuntime().exec(String),Process.waitFor()进程退出后才会执行后续代码
  ProcessHandle ph = Process.toHandle(); //long getPid()等方法直接代理给了ProcessHandle.getPid(),当前进程ProcessHandle.current()
  Info i=ProcessHandle.info(); //Info包含了进程命令信息,Optional<String[]> args=Info.arguments(); 命令:Info.command().orElse(“”)
  //onExit().thenAccept(ph –> System.out.println(“PID %d terminated%n”, ph.getPid())); 使用lamda响应进程退出信息,onExit().get()等待进程
多版本三方包Multi-Release Jar
  META-INFO/MANIFEST.MF,包含条目 Multi-Release: true
  META-INFO/releases/9/A.class,在JDK9时可替代/A.class,JDK10则对应10目录
  //例如获取pid的不同方法,可提供多JDK支持的jar包,JarFile.isMultiRelease()
  //JDK8及以前:jvmName = ManagementFactory.getRuntimeMXBean().getName(); index = jvmName.indexOf('@'); pid=index<1?0:jvmName.substring(0, index);
  //JDK9及以后:ProcessHandle.current().getPid();
  jar cfe pid.jar PrintPID -C v1 PrintPID.class -C v1 Util.class --release 9 -C v2 Util.class //java –jar pid.jar,支持JDK8和JDK9
调用栈访问StackWalker
  StackTraceElement[] stackTrace = new Throwable().getStackTrace(); //老的方式比较耗性能
  StackWalker sw2 = StackWalker.getInstance(); //options可选RETAIN_CLASS_REFERENCE、SHOW_HIDDEN_FRAMES
  sw.forEach(System.out::println); //Consumer<? super StackWalker.StackFrame> action,StackFrame支持fileName、methodName、lineNumber等信息
  long numFrames = sw.walk(frames_ -> frames_.count()); //forEach()等价于walk(s -> { s.forEach(action); return null; });
发布订阅框架
  SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
  MySubscriber<String> subscriber = new MySubscriber<>(); //class MySubscriber<T> implements Subscriber<T>{void onSubscribe(Subscription subscription)}
  publisher.subscribe(subscriber); publisher.submit(“A”); publisher.close();



Java Language Changes for Java SE 9的更多相关文章

  1. Java Language and Virtual Machine Specifications

    The Java Language Specification, Java SE 8 Edition HTML | PDF The Java Virtual Machine Specification ...

  2. Java® Language Specification

    Java™ Platform, Standard Edition 8 API Specification http://docs.oracle.com/javase/8/docs/api/ The J ...

  3. study java language

    2016.11.30 1).About the Java Technology 2).The Java Language Environment: Contents

  4. java 语言规范 java language specifications

    在线地址: https://docs.oracle.com/javase/specs/ java语言规范下载: 链接:http://pan.baidu.com/s/1miEpJwk 密码:f89v j ...

  5. Learning Java language Fundamentals

    Chapter 2 Learning Java language fundamentals exercises: 1.What  is Unicode? Unicode is a computing ...

  6. vscode + gradle 创建 java 项目 - java language server无法启动

    1.在系统上安装一个版本的gradle,用`gradle init --type java-application`创建一个默认的java项目,假设项目目录是hellojava 2.vscode写ja ...

  7. Java Language Keywords

    Java Language Keywords 典型题目 true.false.null.sizeof.goto.synchronized 哪些是Java关键字?(goto.synchronized) ...

  8. JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language

    JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...

  9. 笔记:Java Language Specification - 章节17- 线程和锁

    回答一个问题:多线程场景下,有时一个线程对shared variable的修改可能对另一个线程不可见.那么,何时一个线程对内存的修改才会对另一个线程可见呢? 基本的原则: 如果 读线程 和 写线程 不 ...

随机推荐

  1. Linux下安装Nginx教程

    什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下N ...

  2. iOS笔记杂记

    Google Mobile Ads SDK更新至7.2.1不能编译,添加依赖库QuartzCore.framework后正常编译 imageName会把image缓存到手机内存里,不适合大量图片浏览会 ...

  3. Valgrind的Memcheck快速入门

    一.前言        对于C/C++程序员来说,关于内存问题真是让人头痛不已,尤其是内存泄露.使用未初始化的局部变量进行跳转或移动等隐形问题.要求程序员养成良好的编码习惯确实很重要,但是人总会出现稀 ...

  4. 我也说说Emacs吧(3) - 文件基本操作

    Spacemacs文件基本操作 有了前两讲的积累,我们知道了: 1. 我们既要学习emacs的操作,也要学习vi的操作 2. emacs是一个可扩展的平台,我们并不是从头配置,而是使用一套成熟的集成方 ...

  5. 重学CPP

    LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt After install ...

  6. [Linux] find文件查找和grep文件内容查找

    在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区别的: (1)find命令:根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时 ...

  7. C#中PadLeft和PadRight小知识点

    当我们显示字符串数据时,有时候我们需要考虑数据的排列美观. 比如一些人名和一些编号,我们想让他们整齐对齐显示等. C# String类提供了2种操作方法: String.PadLeft(int tot ...

  8. 高德地图Demo运行报错 com.android.ide.common.process.ProcessException: Failed to execute aapt

    最近由于有需求去做导航方面的Android开发,很是无奈,以前也的确是没有搞过,领导开大会当着所有人的面说这是给我分配的第一个工作,无论如何要做好,突然间感觉压力好大,自己已经多年没有敲过代码,而且A ...

  9. js之无缝轮播图

      HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  10. mac下安装伪分布hadoop2.6.0和hbase1.0.1.1

    1.安装JDK,我安装的是java1.7 2.创建管理员账户 3.安装ssh服务(如果已有跳过此步) 4.ssh无密码验证登陆 以上过程略,可参考ubuntu下安装hadoop一文. 5.下载并解压h ...