theme: orange
一起养成写作习惯!这是我参与「掘金日新计划 · 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提供这类的支持。
上图展示了从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将根据我们在运行时的需求来重新调整本身)
未完待续,下面继续讲各个版本的新特性,敬请期待!