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的修改可能对另一个线程不可见.那么,何时一个线程对内存的修改才会对另一个线程可见呢? 基本的原则: 如果 读线程 和 写线程 不 ...
随机推荐
- Linux下安装Nginx教程
什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下N ...
- iOS笔记杂记
Google Mobile Ads SDK更新至7.2.1不能编译,添加依赖库QuartzCore.framework后正常编译 imageName会把image缓存到手机内存里,不适合大量图片浏览会 ...
- Valgrind的Memcheck快速入门
一.前言 对于C/C++程序员来说,关于内存问题真是让人头痛不已,尤其是内存泄露.使用未初始化的局部变量进行跳转或移动等隐形问题.要求程序员养成良好的编码习惯确实很重要,但是人总会出现稀 ...
- 我也说说Emacs吧(3) - 文件基本操作
Spacemacs文件基本操作 有了前两讲的积累,我们知道了: 1. 我们既要学习emacs的操作,也要学习vi的操作 2. emacs是一个可扩展的平台,我们并不是从头配置,而是使用一套成熟的集成方 ...
- 重学CPP
LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt After install ...
- [Linux] find文件查找和grep文件内容查找
在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区别的: (1)find命令:根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时 ...
- C#中PadLeft和PadRight小知识点
当我们显示字符串数据时,有时候我们需要考虑数据的排列美观. 比如一些人名和一些编号,我们想让他们整齐对齐显示等. C# String类提供了2种操作方法: String.PadLeft(int tot ...
- 高德地图Demo运行报错 com.android.ide.common.process.ProcessException: Failed to execute aapt
最近由于有需求去做导航方面的Android开发,很是无奈,以前也的确是没有搞过,领导开大会当着所有人的面说这是给我分配的第一个工作,无论如何要做好,突然间感觉压力好大,自己已经多年没有敲过代码,而且A ...
- js之无缝轮播图
HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- mac下安装伪分布hadoop2.6.0和hbase1.0.1.1
1.安装JDK,我安装的是java1.7 2.创建管理员账户 3.安装ssh服务(如果已有跳过此步) 4.ssh无密码验证登陆 以上过程略,可参考ubuntu下安装hadoop一文. 5.下载并解压h ...