Java8于2014年3月18日公布,截止到2022年4月6日,以后最新发行版本是Java18。版本17、11和8是目前反对的长期反对(LTS)版本。这篇文章率领大家回顾从Java 8 开始每个版本的个性,小板凳坐好,发车了!

版本概览
Java8 LTS 上一次商业用途的免费软件公共更新是在2019年1月由 Oracle 公布的,而 Oracle 持续更新并公布收费的公共 java8,用于开发和集体用处。java7不再受公众反对。对于java11,Oracle不会为公众提供长期反对; 相同,更宽泛的 OpenJDK 社区,如 Eclipse Adoptium 或其余社区,将会代替Oracle提供这类的反对。

上图展现了从Java SE 8开始到Java SE 18的历史版本公布过程,秉着2017年9月,Java 平台的首席架构师 Mark Reinhold 提议将公布列车改为“每六个月公布一个个性”的约定,也给出了将来到Java SE 21的公布布局。

Java18的个别可用性开始于2022年3月22日,最新的(第三次) LTS Java 17开始于2021年9月14日。java19正在开发中,晚期拜访构建曾经可用。

Java 8 个性
Lambda 表达式容许咱们应用函数作为办法参数。

让咱们来看看 Java 8之前的代码,过后咱们必须创立一个匿名类来实现一个简略的接口。

Thread t = new Thread(new Runnable() { public void run() {  System.out.println("Start thread"); }});复制代码

应用 lambda 表达式,咱们能够这样做。

Thread t1 = new Thread(() -> { System.out.println("Start 1st thread");});复制代码

函数接口是只有一个形象办法的接口。此外,Interface 能够有默认办法和静态方法,但只有一个形象办法。

Stream 是java.util.Stream包中的一个接口,它提供了对汇合执行程序和并行操作的办法。Collection Interface 的 Stream ()办法返回给定汇合的类型为 Stream 的元素流。流接口反对过滤、映射或查找流中元素的聚合后果所需的许多操作。

在上面的实例,咱们调用 List 上的 stream ()办法,而后将 Predicate (Functional Interface)传递给返回布尔值的 anyMatch ()办法。

List<String> colors = new ArrayList<>(Arrays.asList("Green","Yellow","Red"));boolean isTrue = colors.stream().anyMatch(x -> x.equals("Red"));System.out.println(isTrue);复制代码

Optional 可创立一个容器对象,该对象可能蕴含也可能不蕴含非空值,通过应用 它,咱们能够isPresent ()来查看一个值是否为非空。

在上面的示例中,咱们应用 Stream Interface 的 findAny ()办法返回一个 Optional 对象。基于可选实例的值,咱们能够执行相应的逻辑。

List<String> colors = new ArrayList<>(Arrays.asList("Green","Yellow","Red"));Optional<String> color = colors.stream().filter(x -> x.equals("Black")).findAny();System.out.println(color.isPresent()? color.get() : "Not Found");复制代码

对 java.util.concurrent 包的更改:

引入了 Interface CompletionStage、 Class CompletableFuture 和 CompletionException。
CompletableFuture 能够帮忙执行异步工作,这些工作比在 java8之前存在的 Future 对象更加灵便和加强。
Method References (::) ,咱们能够应用双冒号来调用现有的办法,而不是应用 lambda 表达式。办法援用能够用来援用静态方法和实例办法。

上面演示一个援用静态方法的示例。首先,让咱们应用 lambda 表达式实现一个办法调用。

public class Main {    public static void main(String[] args)  {     List<Integer> locList = new ArrayList<>(Arrays.asList(1,2,5,6));     boolean isFound = locList.stream().anyMatch(l -> isEqual(l));     System.out.println(isFound);    }    public static <T> boolean isEqual(T a) {    Predicate<T> isEqual = (x) -> x.equals(5);    return isEqual.test(a);    }}复制代码

isEqual ()是 Main 类中的一个静态方法,因而咱们能够简略地应用办法援用来实现工作,而不是应用 lambda 表达式来调用该办法。

public class Main {

public static void main(String[] args)  { List<Integer> locList = new ArrayList<>(Arrays.asList(1,2,5,6)); boolean isFound = locList.stream().anyMatch(Main::isEqual); System.out.println(isFound);}public static <T> boolean isEqual(T a) { Predicate<T> isEqual = (x) -> x.equals(5); return isEqual.test(a);}

}
复制代码
篇幅无限,除了下面讲到的新特色,还有几个重要的,包含当不限于:

Parallel Array Sorting (并发数组排序)
Date & Time API (日期和工夫操作接口,LocalDate,ZoneId,Clock)
Base64 encoding and decoding (Base64 编码和解码自反对)
Permanent Generation(Metaspace将依据咱们在运行时的需要来从新调整自身)
未完待续,上面持续讲各个版本的新个性,敬请期待!

最初
如果你感觉此文对你有一丁点帮忙,点个赞。或者能够退出我的开发交换群:1025263163互相学习,咱们会有业余的技术答疑解惑

如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star:http://github.crmeb.net/u/defu不胜感激 !

残缺源码下载地址:https://market.cloud.tencent....

PHP学习手册:https://doc.crmeb.com
技术交换论坛:https://q.crmeb.com