前言
在本文中,我将描述自第8版以来Java最重要且对开发人员友好的功能。为什么会有这样的主意?在Web上,您可以找到许多文章,其中包含每种Java版本的新功能列表。但是,由于缺少文章,因此无法简要概述自第8版以来最重要的更改。好的,但是为什么是第8版?令人惊讶的是,它仍然是最常用的Java版本。即使我们已经到了Java 16发行版的前夕果。如您所见,超过46%的响应者仍在生产中使用Java 8。相比之下,只有不到10%的响应者使用Java 12或更高版本。
那接下来咋们从JDK8到JDK15,给大家介绍新的JDK提供给咋们的新特性!
JDK8
最直接作用就是减少代码,代码直接减少50%+,显得非常简洁
1 | vbnet复制代码 //使用java匿名内部类 |
1 | csharp复制代码// java7中 筛选产品为nike的 |
位于java.util.function包下,下面介绍最常用的几个
- Predicate
接收一个值返回boolean
1 | ini复制代码 Predicate p = t->true; |
- Supplier
无接受参数返回一个值
1 | ini复制代码Supplier<T> s = () -> new T(); |
- Consumer
接受一个参数无返回值
1 | ini复制代码Consumer<String> c = c -> System.out.println(s); |
- Function<T,R>
接受参数T 返回参数R
1 | vbnet复制代码Function<Long,String> f = c -> String.valueof(c); |
- 其他还有一些 BiFunction,BiConsumer,DoubleSupplier等大家有兴趣自己去阅读下源码
- 静态引用:
格式:Class::static_method
1 | ini复制代码List<String> list = Arrays.asList("a","b","c"); |
- 构造器调用
构造器方法引用格式:Class::new,调用默认构造器
1 | arduino复制代码List<String> list = Arrays.asList("a","b","c"); |
- 方法调用
格式:instance::method
1 | arduino复制代码List<String> list = Arrays.asList("a","b","c"); |
1 | scss复制代码// 使用jdk1.8中的Stream API进行集合的操作 |
1 | csharp复制代码public interface ProtocolAdaptor { |
- Optional
用于处理对象空指针异常:
1 | typescript复制代码 public String getDesc(Test test){ |
JDK9
借助Java 9的一项新功能,即集合工厂方法,您可以轻松地使用预定义的数据创建不可变的集合。您只需要在特定集合类型上使用of方法。
1 | ini复制代码List<String> fruits = List.of("apple", "banana", "orange"); |
在Java 9之前,您可以使用Collections,但这绝对是一种更复杂的方法。
1 | typescript复制代码public List<String> fruits() { |
同样,仅从ArrayList对象表创建即可使用Arrays.asList(…)method。
1 | typescript复制代码public List<String> fruitsFromArray() { |
从Java 8开始,您可以在接口内部使用公共默认方法。但是仅从Java 9开始,由于接口中的私有方法,您将能够充分利用此功能。
1 | csharp复制代码ublic interface ExampleInterface { |
JDK10
从Java 9和Java 10开始,有几种用于Optional的有用方法。其中最有趣的两个是orElseThrow和ifPresentOrElse。如果没有值,则使用该orElseThrow方法抛出NoSuchElementException。否则,它返回一个值。
1 | ini复制代码public Person getPersonById(Long id) { |
因此,您可以避免将带参数的if语句与isPresentmethod一起使用。
1 | vbnet复制代码public Person getPersonByIdOldWay(Long id) { |
第二种有趣的方法是ifPresentOrElse。如果存在一个值,它将使用该值执行给定的操作。否则,它将执行给定的基于空的操作。
1 | csharp复制代码public void printPersonById(Long id) { |
在Java 8中,我们可以if-else直接与isPresent方法一起使用。
1 | csharp复制代码public void printPersonByIdOldWay(Long id) { |
JDK 10 && JDK 11
从Java 10开始,您可以声明没有其类型的局部变量。您只需要定义var关键字而不是类型。从Java 11开始,您还可以将其与lambda表达式一起使用,如下所示。
1 | typescript复制代码public String sumOfString() { |
JDK 12
使用Switch表达式,您可以定义多个case标签并使用箭头返回值。此功能自JDK 12起可用。它使Switch表达式真正更易于访问。
1 | arduino复制代码 public String newMultiSwitch(int day) { |
对于低于12的Java,相同的示例要复杂得多。
1 | arduino复制代码public String oldMultiSwitch(int day) { |
JDK 13
文本块是多行字符串文字,它避免使用转义序列,并以可预测的方式自动设置字符串格式。它还使开发人员可以控制字符串的格式。从Java 13开始,文本块可用作预览功能。它们以三个双引号(”””)开头。让我们看看我们如何轻松地创建和格式化JSON消息。
1 | typescript复制代码 public String getNewPrettyPrintJson() { |
创建Java 13之前的相同JSON字符串要复杂得多。
1 | swift复制代码 public String getOldPrettyPrintJson() { |
JDK14
使用Records,您可以定义不可变的纯数据类(仅限getter)。它会自动创建toString,equals和hashCode方法。实际上,您只需要定义如下所示的字段即可。
1 | arduino复制代码public record Person(String name, int age) {} |
具有类似功能的类如record包含字段,构造函数,getter和实施toString,equals以及hashCode方法。
1 | typescript复制代码public class PersonOld { |
JDK15
使用密封类功能,您可以限制超类的使用。使用new关键字,sealed您可以定义哪些其他类或接口可以扩展或实现当前类。
1 | kotlin复制代码public abstract sealed class Pet permits Cat, Dog {} |
允许的子类必须定义一个修饰符。如果您不想允许任何其他扩展名,则需要使用final关键字。
1 | scala复制代码public final class Cat extends Pet {} |
另一方面,您可以打开扩展类。在这种情况下,应使用non-sealed修饰符。
1 | scala复制代码public non-sealed class Dog extends Pet {} |
当然,下面的可见声明是不允许的。
1 | scala复制代码public final class Tiger extends Pet {} |
结束
🔍 微信公众号
coding途中
,扫码加入我们交流群!
本文转载自: 掘金