首页 > 编程语言 >Java新特性(1):Java 9和Java10

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

时间:2022-11-17 07:55:37浏览次数:46  
标签:Java Java10 list System 特性 var println out

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

 

自从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增加一些特性:

 

 

 

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一个接口中能定义如下几种变量/方法:

1、常量

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的特性少了很多:

 

 

 

 

比较有意思的就是增加了一个叫做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这个关键字,但我想真正习惯这种用法的人毕竟还是少数吧。而且对于大多数码农来说,如果在接手的系统中看到这种「新式」代码,可能会有点懵。至于其他新增的特性,基本都是鸡肋。

 

 


 

 

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

标签:Java,Java10,list,System,特性,var,println,out
From: https://www.cnblogs.com/xiangwang1111/p/16897493.html

相关文章

  • 牛客java基础语法在线编程-知识点小结(待完善)
    知识点小结一、输入输出Scanner类Scanner类在java.util包下,导包格式如下:importjava.util.Scanner;使用示例:importjava.util.Scanner;classMain01{publ......
  • LiquibaseException java.lang.ClassCastException: class java.time.LocalDateTime c
      https://forum.liquibase.org/t/liquibaseexception-java-lang-classcastexception-class-java-time-localdatetime-cannot-be-cast-to-class-java-lang-string/5059......
  • JAVA IO流
    纯文本字符流比字节流效率高.1.这个理解的特别好:http://t.zoukankan.com/liaozuheng-p-13046873.html2.节点流与处理流的介绍:https://blog.csdn.net/wcg920212/article/d......
  • JAVA课程设计(附源码)
    Java课程设计选题Java课程设计说明本次课程设计的目的是通过课程设计的各个项目的综合训练,培养学生实际分析问题、编程和动手能力,提高学生的综合素质。本课程设计尝试使......
  • java——API—— Object类——equals方法
                                                        ......
  • java——API—— Object类——toString方法
    Object类的概述概述java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。如果一个......
  • java——API——Math类
                                                         ......
  • Javascript(笔记40) - ES6特性 - Map
    Javascript(笔记40)-ES6特性-MapMap ES6 提供了Map数据结构。它类似于对象,也是键值对集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map也实......
  • #yyds干货盘点#聊聊javascript——call、applay、bind
    Callcall()方法使用一个指定的this值和单独给出的一个或多个参数来调用一个函数。​使用方法:letbar={name:'johnny'}functionfoo(){console.log(this.name......
  • Java学习——11.16
    今天把狂神的Java基础看完了,但Java基础没完全看完。从网上看的狂神的评价都不好,就很无语!!!,对此还想了很久。也是自己学完,感觉没啥用(和鹏哥一个天上一个地下),太杂太乱了,明......