Java Language Changes for Java SE 9
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的更多相关文章
- Java Language and Virtual Machine Specifications
The Java Language Specification, Java SE 8 Edition HTML | PDF The Java Virtual Machine Specification ...
- Java® Language Specification
Java™ Platform, Standard Edition 8 API Specification http://docs.oracle.com/javase/8/docs/api/ The J ...
- study java language
2016.11.30 1).About the Java Technology 2).The Java Language Environment: Contents
- java 语言规范 java language specifications
在线地址: https://docs.oracle.com/javase/specs/ java语言规范下载: 链接:http://pan.baidu.com/s/1miEpJwk 密码:f89v j ...
- Learning Java language Fundamentals
Chapter 2 Learning Java language fundamentals exercises: 1.What is Unicode? Unicode is a computing ...
- vscode + gradle 创建 java 项目 - java language server无法启动
1.在系统上安装一个版本的gradle,用`gradle init --type java-application`创建一个默认的java项目,假设项目目录是hellojava 2.vscode写ja ...
- Java Language Keywords
Java Language Keywords 典型题目 true.false.null.sizeof.goto.synchronized 哪些是Java关键字?(goto.synchronized) ...
- JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language
JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...
- 笔记:Java Language Specification - 章节17- 线程和锁
回答一个问题:多线程场景下,有时一个线程对shared variable的修改可能对另一个线程不可见.那么,何时一个线程对内存的修改才会对另一个线程可见呢? 基本的原则: 如果 读线程 和 写线程 不 ...
随机推荐
- 验证email是否合法
https://buluo.qq.com/p/detail.html?bid=339910&pid=6675390-1514450689&from=grp_sub_obj 场景1:验证 ...
- 十三、dbms_flashback(用于激活或禁止会话的flashback特征)
1.概述 作用:用于激活或禁止会话的flashback特征,为了使得普通用户可以使用该包,必须要将执行该包的权限授予这些用户,grant execute on dbms_flashback to sc ...
- LINUX文件的权限
一.权限设定的意义:系统最底层安全设定方法之,保证文件可以被可用的用户做相应操作. 二.文件权限的查看(alias) 命令:ls ls -l file ## 查看文件属性 ls -ld mkdir ...
- react 入门的好东西 可以做出一个完整的网站
链接 (包含了antd 组件的使用) 安装依赖报错问题 可能需要按顺序安装, 不能cnpm npm 混合安装, 参考这个package.js ...
- Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结
知识背景: 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式.英语叫做IPv4 numbers-and-dots notation. 如果把210.25.132.181转换 ...
- http和https区别
超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息,HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文, ...
- 我也说说Emacs吧(7) - lisp基础
lisp基础 Lisp是仅次于Fortran的第二古老的著名计算机语言. Lisp从一开始就与众不同的一点在于,它是基于S-表达式的语言.也就是说,代码和数据是用同一种方式表达出来的. S-表达式,我 ...
- learn go recursive
package main // 参考文章: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.6.md im ...
- 颜色叠加模式:mix-blend-mode
文章转自叠加模式 http://www.cgspread.com/3551.html 注释:1.混合模式的数学计算公式,另外还介绍了不透明度.2.这些公式仅适用于RGB图像,对于Lab颜色图像而言,这 ...
- docker学习(一)在centos7上安装与启动docker
CentOS Docker 安装 1.Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS ...