java⼤括号转义_Java:未来已来
前⾔:在10⽉22的 Oracle Codeone⼤会上,Java平台的⾸席架构师 Mark Reinhold 做了The Future of Java is Today的演讲, 回顾了最近Java的⼏个版本的新的功能,Java的每年两次的发布周期, 澄清了关于发布流程和Java版本的⼏个误区,最后花了很⼤的篇幅介绍了未来Java⼏个令⼈⾮常期待的⼏个孵化中项⽬,可以为Java带来更好的⽣产⼒、性能和可扩展性。我整理了这四个项⽬相关的知识,你可以提前了解到Java未来的这些酷炫的特性。
Java各版本的发布时间点和LTS版本
Mark Reinhold 我不多介绍了, 之前要了解Java的未来动向看Java之⽗James Gosling, 他离开Oracle之后想了解Java的动向就看Mark Reinhold。
Project Amber
提供⾯向⽣产⼒的Java特性, ⽐如字符串字⾯值、switch表达式、模式匹配、record等
这个项⽬包含很多Java语⾔特性的新功能。
包括:
正在实现的:时间正则表达式java
JEP 302 Lambda Leftovers: 对lambda功能的补强, ⽐如下划线变量等BiFunctionbiss = (i, _) -> String.valueOf(i);, lambda参数的Shadowing,消除⼀些歧义等修补⼯作
JEP 305 Pattern Matching: 这个功能⾮常好,Scala和kotlin中的模式匹配⾮常强⼤,这个jep提供了类似的功能,配合switch和record,可以⼤⼤简化条件分⽀的处理,如:
1
2
3
4
5
6
7
8
9
int eval(Node n) {
switch(n) {
case IntNode(int i): return i;
case NegNode(Node n): return -eval(n);
case AddNode(Node left, Node right): return eval(left) + eval(right);
case MulNode(Node left, Node right): return eval(left) * eval(right);
default: throw new IllegalStateException(n);
};
}
数据类,⼀⾏定义,省去了字段、字段访问⽅法和hash、equals、toString等⽅法,定义ValueObject简化到家了:
1
record Point(int x, int y);
JEP 325 Switch Expressions (preview, JDK 12): 当前的switch是什么, 语句。这个jep扩展switch,并且可以作为表达式使⽤:
1
2
3
4
5
6
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
JEP 326 Raw String Literals (preview, JDK 12): 这个很多语⾔中都实现了,可以更好的书写字符串字⾯值, 尤其在正则表达式中处理很多转义符的时候,和Go类似:
1
2
3
4
String s = `
this is my
embedded string
`;
JEP draft 8209434 Concise Method Bodies: 正常的⽅法定义以⼤括号包裹,这个特性提供了类似Lambda表达式简化⽅式的形式,直接单⾏定义⽅法体, 类似C#和kotlin的特性:
1
2
3
4
5
6
7
class MyList<T> implements List<T> {
private List<T> aList;
public int size() = aList::size;
public T get(int index) = aList::get;
...
}
已发布的:
JEP 286 Local-Variable Type Inference (var) (JDK 10): 本地变量的类型推断, 也就是使⽤var定义变量,有些同学已经⽤起来了,⾮常的⽅便,有点类似动态类型的语⾔,感觉虽然还没有达到Scala那么灵活,已经很不错了
JEP 323 Local-Variable Syntax for Lambda Parameters (JDK 11): 对本地变量的类型推断的加强,⽤
在Lambda表达式中。
暂时搁置的:
JEP 301 Enhanced Enums.
总之,每⼀个特性都可以⼤⼤简化我们的开发,让Java更像⼀个"现代的"编程语⾔。
Project Loom
提供⼀个轻量级的⽤户态的纤程,叫做fiber,更加简化并发编程,⽽且更有效
Mark Reinhold ⾸先使⽤jshell演⽰了fiber的使⽤,⼀两⾏程序就可以做到,我觉得⽅便性可以和goroutine相媲美了。他接着使⽤⼀个restful的例⼦⽐较了Thread和Fiber的性能, restful服务收到请求后暂停100毫秒,模拟⼀个慢的io操作,结果显⽰Thread很很多⼏百毫秒的尖峰,⽽fiber在预热之后⼀直稳定在100毫秒。 这绝对是Java程序员值的关注⼀个新特性。
例⼦使⽤jetty做服务器,线程池执⾏命令的时候让fiber去调度,这种⽅式对现有的代码改动很⼩。
我⽐较关注的是如果它的内部调度算法怎么实现的,另外,⼀个包含复杂业务完成时间较长的fiber是否能被调度器⾃动调度,以便使⽤有限的线程调度其它的fiber, 类似goroutine在系统调⽤的时候⾃动插⼊检查点。
Project Panama
提升JVM和外部(⾮java)代码和数据联系
当然,这个项⽬不仅仅是简化JNI的开发,⽽且提供了很多的特性:
native function calling from JVM (C, C++), specifically per JEP 191
native data access from JVM or inside JVM heap
new data layouts in JVM heap
native metadata definition for JVM
header file API extraction tools (see below)
native library management APIs
native-oriented interpreter and runtime “hooks”
class and method resolution “hooks”
native-oriented JIT optimizations
tooling or wrapper interposition for safety
exploratory work with difficult-to-integrate native libraries
Mark Reinhold在演讲中举了两个例⼦,⾸先是为 POSIX 操作系统 API 的头⽂件unistd.h中的函数⽣成Java的可访问代码。
jextract⼯具会⽣成⼀堆的函数和类型,关键这些是从c的头⽂件中⾃动⽣成的,你不必费劲⼼思去⾃⼰设计类型和⽅法了。这⼀点⽐Go语⾔中的CGO要⽅便多了,快捷度可以和C#互操作性相媲美。
所以以后你要是想从Java中访问C的链接库,可以使⽤jextract⼀步⽣成,
调⽤⽅法也很⽅便。
另⼀个例⼦是调⽤C标准库time.h中的clock_gettime函数,它的参数需要struct类型,使⽤上⾯相同的⼿段可以⽣成访问类:
当然这两个例⼦只演⽰了这个项⽬的⼀个功能,更多的功能我们可以持续关注。
Project Valhalla
包含两个feature: 值类型和基本类型的泛型。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论