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. settings.xml配置文件详解

    简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...

  2. Unity 3D插入MySql中文无法显示问题

    使用Unity3D向mySql中插入数据,然后进入mySql查看数据库,吓我一跳中文全部乱码. 随后各种查阅资料,网站上给出解释,MySql应该使用utf8编码,查看我的mySql默认是使用utf8编 ...

  3. LeetCode OJ:Generate Parentheses(括号生成)

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  4. New Concept English three(18)

    speed:31w/m 56 words Modern sculpture rarely surprises us any more. The idea that modern art can onl ...

  5. 理解 uncaughtException 和 domain 和 try catch 区别

    文章 实践 uncaughtException 捕获的是全局的异常, 反应慢, 每个回调完成后才发出异常, 书写也麻烦 domain 可以捕获每个异常, 及时反馈, 并且书写简洁 但他们两个捕获的异常 ...

  6. Linux:网络配置

    网络配置 1.网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 1DEVICE=eth0 2 HWADDR=00:0C:29:93:41:2B 3 ...

  7. currentTarget,this,target区别

    currentTarget  : 事件处理程序当前正在处理事件的那个元素 this : 当前的事件发生的元素 target : 事件的目标 currentTarget和this值是始终相等的,但是ta ...

  8. Android 框架学习3:从 EventBus 中学到的精华

    关联文章: EventBus 3.0 的特点与如何使用 源码分析 EventBus 3.0 如何实现事件总线 学习的目的是为了超越,经过前面对 EventBus 3.0 的学习,我们已经对它相当熟悉了 ...

  9. 使用编译时注解简单实现类似 ButterKnife 的效果

    这篇文章是学习鸿洋前辈的 Android 如何编写基于编译时注解的项目 的笔记,用于记录我的学习收获. 读完本文你将了解: 什么是编译时注解 APT 编译时注解如何使用与编写 举个例子 思路 创建注解 ...

  10. [Python] 比较两个数组的元素的异同

    通过set()获取两个数组的交/并/差集: print set(a) & set(b) # 交集, 等价于set(a).intersection(set(b)) print set(a) | ...