面试反杀 | 请谈谈Java8-18引入的新特性(一)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

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提供这类的支持。

image.png

上图展示了从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 可以有默认方法和静态方法,但只有一个抽象方法。

Streamjava.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将根据我们在运行时的需求来重新调整本身)

未完待续,下面继续讲各个版本的新特性,敬请期待!

猜你喜欢

转载自juejin.im/post/7083284455502118948