2

Java新特性(1):Java 9和Java10

 1 year ago
source link: https://blog.51cto.com/u_15817148/5857753
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java新特性(1):Java 9和Java10

精选 原创

湘王爱娟娟 2022-11-16 21:03:21 博主文章分类:技术 ©著作权

文章标签 java Java9 Java10 文章分类 Java 编程语言 yyds干货盘点 阅读数149

您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~

自从Java在2009年被Oracle收购之后,就不再开源,除了Oracle官方发布的版本之外,还有OpenJDK版本,这两者的区别可以自行找某度去搞明白。对于没有几千万用户的应用来说,OpenJDK已经足够了,即使是一些大厂,内部系统用OpenJDK也足够了。

从Java 8开始,整个JDK就一直在致力于不断改进,不断融合新的开发特性。Java目前始终保持前向兼容,所以如果有新的稳定版JDK出来,就可以立即使用新的JDK,尝试一些新特性,而不必担心不兼容的问题(可能个别地方有改动,但对个人及小型开发来说可以忽略不计)。

先做一些名词解释:

1、JEP:Java Enhancement Proposals,Java增强提案。

2、JSR:Java Specification Requests的缩写,意思是Java规范提案,是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。

3、CSR:是Compatibility & Specification Review的缩写,也就是兼容性和特征检视。

4、?标记:是那些未在官方JEP中列出,但明确在该版本Java API中具有,而前一版本API没有的特性。

先来看看Java9增加一些特性:

Java新特性(1):Java 9和Java10_Java10

Java9主要的改进包括模块系统(261)、JShell(222)、日志集成(264)、弃用GC组合(214)、统一JVM日志(158)、统一GC日志(271)、集合工厂方法(269)、G1作为默认GC(248)、废弃CMS GC(291)、Http 2 Client(110)、私有接口方法(?)、Stream API(?)、Flow API(?)等。

其中,模块系统、JShell完全是鸡肋,可以忽略;

日志集成基本上也不会用Java自带的,跳过;

关于GC的后面会说,这里跳过;

Http 2 Client在后续Java10及更高版本中又有改进,Java9中的语法基本被废弃,所以可以先不看;

Flow API其实也是鸡肋,在外部MQ如此强大的情况下,没有人会用Java自带的Pub-Sub。

所以总结说起来,Java9真正比较有用的就是集合工厂方法、私有接口方法和Stream API了。

在Java9以前创建集合的时候,是这么干的:

/**
* 以前的集合创建方法
*/
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set = Collections.unmodifiableSet(set);
System.out.println(set);
List<String> list = new ArrayList<>();

list.add("A");
list.add("B");
list.add("C");
list = Collections.unmodifiableList(list);
System.out.println(list);
Map<String, String> map = new HashMap<>();

map.put("A", "Apple");
map.put("B", "Boy");
map.put("C", "Cat");
map = Collections.unmodifiableMap(map);
System.out.println(map);

而Java9就开始偷懒了:

/**
* 新的集合工厂方法
*/
Set<String> set2 = Set.of("A", "B", "C");
System.out.println(set2);
List<String> list2 = List.of("A", "B", "C");
System.out.println(list2);
Map<String, String> map2 = Map.of("A", "Apple", "B", "Boy", "C", "Cat");
System.out.println(map2);

Map<String, String> map3 = Map.ofEntries(
new AbstractMap.SimpleEntry<>("A", "Apple"),
new AbstractMap.SimpleEntry<>("B", "Boy"),
new AbstractMap.SimpleEntry<>("C", "Cat"));
System.out.println(map3);

Java8一个接口中能定义如下几种变量/方法:

2、抽象方法

3、默认方法

4、静态方法

Java9又增加了两种:

1、私有方法

2、私有静态方法

可以敲代码试试看:

/**
* Java9的新接口方法
*
* @author 湘王
*/
public interface NewInterface {
// 私有方法
private void method1() {
System.out.println("from private method");
}

// 私有静态方法
private static void method2() {
System.out.println("from private static method2");
}

default void general() {
method1();
method2();
}
}

基于Java8的流式编程,Java9又增加了几个方法:takeWhile、dropWhile、iterate和ofNullable。来看看代码:

// Stream API
// 遇见空值停止输出
Stream.of("a","b","c","","e","f").takeWhile(s-> !s.isEmpty())
.forEach(System.out::println);
// 遇见空值才开始输出
Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
.forEach(System.out::println);
// 函数式迭代,使用初始种子值创建顺序(可能是无限)流
IntStream.iterate(3, x -> x < 10, x -> x + 3)
.forEach(System.out::println);
// 预防NullPointerExceptions异常, 可以通过检查流来避免null值
long count = Stream.ofNullable(null).count();
System.out.println(count);

相比较于Java 9,Java10的特性少了很多:

Java新特性(1):Java 9和Java10_Java10_02

比较有意思的就是增加了一个叫做var的关键字(向Javascript学习吗?Java也想长个script的尾巴?)

// var关键字
// 不建议这样,非常不安全
var set = Set.of("A", 1, "C");
System.out.println(set);
var list = List.of("A", 2, "C");
System.out.println(list);
var map = Map.of("A", 1, "B", "Boy", "C", "Cat");
System.out.println(map);
for (var s : list) {
System.out.println(s);
}

// 应该这样使用
var list2 = new ArrayList<String>();
list2.add("1");
list2.add("2");
list2.add("3");

// 属性字段不能用var
private var list = new ArrayList<String>();

// 方法参数不能用var
public void test(var list) {
System.out.println("123");
}

虽然多了var这个关键字,但我想真正习惯这种用法的人毕竟还是少数吧。而且对于大多数码农来说,如果在接手的系统中看到这种「新式」代码,可能会有点懵。至于其他新增的特性,基本都是鸡肋。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK