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



最新文章

  1. shared jedis 在spring中的配置
  2. 浅谈C++设计模式之单例模式
  3. Channel 笔记本项目 (门户客户端(介绍1) 和 wp7客户端)
  4. 有趣的JavaScript小程序
  5. MySQL中MyISAM引擎及InnoDB引擎的缓存优化设计
  6. Oracle中的日期
  7. XC文件管理器(Android应用)
  8. Oracle 11g新特性invisible index(不可见的索引)
  9. [PATCH] UBUNTU: SAUCE: (no-up) apparmor: Sync to apparmor3 - RC1(v3.4.x kernel)
  10. 关于JSF国际化问题
  11. 初学Java scirpt(判断、循环语句)
  12. HTML超文本
  13. [转]pycharm常用快捷键及设置
  14. 虚拟机iso整理
  15. 用Tensorflow实现DCGAN
  16. Kafka项目实战-用户日志上报实时统计之编码实践
  17. 练手之RimLight
  18. Qt Installer Framework 使用说明(三)
  19. CoreText
  20. Photo2

热门文章

  1. 由浅入深了解EventBus:(一)
  2. centos静默安装oracle12c
  3. 使用tr1的bind函数模板
  4. jQuery插件实现表格隔行换色且感应鼠标高亮行变色
  5. vuex(二)getters
  6. 【剑指offer】找出数组中任意一个重复的数字,C++实现
  7. 【解题报告】13级个人结业赛(二) ——动(dou)态(bu)规(hui)划(zuo)专场
  8. HDU - 6397:Character Encoding (组合数&amp;容斥)
  9. linux自学(二)之centos7镜像安装
  10. jquery 给新增的addClass 使用css样式