Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

在本文中,我们将快速浏览一下Java 8中一些最有趣的新特性。

我们将讨论:接口默认方金宝搏官网188be法和静态方法,方法引用和可选方法。

我们已经介绍了Java 8发行版的一些特性流API,lambda表达式和函数接口-因为它们是综合性的话题,值得单独看一看。

2.接口默认方法和静态方法

在Java 8之前,接口只能有公共抽象方法。如果不强制所有实现类创建新方法的实现,就不可能向现有接口添加新功能,使用实现创建接口方法也是不可能的。

从Java 8开始,接口可以有静态默认的方法尽管在接口中声明,但具有已定义的行为。

2.1。静态方法

考虑接口的以下方法(让我们调用这个接口车辆):

静态字符串生产者(){返回"N&F车辆";}

静态生产商()方法只能通过接口并在接口内部可用。它不能被实现类重写。

要在接口之外调用它,静态方法调用的标准方法应该使用:

String producer = Vehicle.producer();

2.2。默认的方法

默认方法使用new声明默认的关键字。它们可以通过实现类的实例访问,并且可以被重写。

让我们添加一个默认的我们的方法车辆接口,该接口也将调用静态接口方法:

默认字符串getOverview() {return "ATV made by " + producer();}

假设这个接口是由类实现的VehicleImpl。对于处决默认的方法应该创建这个类的实例:

Vehicle Vehicle = new VehicleImpl();String overview = vehicle.getOverview();

3.方法引用

对于只调用现有方法的lambda表达式,方法引用可以作为一种更短、更易读的替代方法。方法引用有四种变体。

3.1。对静态方法的引用

静态方法的引用包含以下语法:ContainingClass:: methodName。

让我们尝试计数所有的空字符串<字符串>列表借助于流API。

boolean isReal = list.stream()。anyMatch (u - > User.isRealUser (u));

代码中的lambda表达式anyMatch ()方法,它只调用一个静态方法isRealUser(用户用户)用户类。因此,它可以被替换为一个静态方法的引用:

boolean isReal = list.stream().anyMatch(User::isRealUser);

这种类型的代码看起来信息量更大。

3.2。引用一个实例方法

对实例方法的引用包含以下语法:containingInstance:: methodName。下面的代码调用方法isLegalName字符串(字符串)类型的用户验证输入参数:

User User = new User();boolean isLegalName = list.stream().anyMatch(user::isLegalName);

3.3。对特定类型对象的实例方法的引用

这个引用方法的语法如下:ContainingType:: methodName。一个例子:

long count = list.stream().filter(String::isEmpty).count();

3.4。对构造函数的引用

构造函数的引用遵循以下语法:类名称::新。由于构造函数在Java中是一种特殊的方法,因此可以通过方法引用对其进行应用作为方法名

Stream = list.stream().map(User::new);

4.可选< T >

在Java 8之前,开发人员必须仔细地验证他们引用的值,因为可能会抛出NullPointerException(肺水肿)。所有这些检查都需要非常恼人且容易出错的样板代码。

Java 8可选< T >类可以帮助处理有可能获得肺水肿它作为对象类型的容器工作T。它可以返回该对象的值,如果该值不是。当容器内的值为它允许执行一些预定义的操作,而不是抛出肺水肿。

4.1。创建可选< T >

的一个实例可选类可以通过其静态方法创建:

可选可选=可选。empty();

返回一个空可选的。

字符串str = "值";可选可选=可选。of(str);

返回一个可选其中包含一个非空值。

可选可选=可选。ofnullable (getString());

将返回一个可选用一个特定值或一个空可选如果参数为null。

4.2。可选< T >使用

例如,你期望得到a<字符串>列表在这种情况下的新实例替换它ArrayList <字符串>。W在前java 8的代码,你需要做这样的事情:

List List = getList();List listOpt = List != null ?list: new ArrayList<>();

在Java 8中,同样的功能可以用更短的代码实现:

List listOpt = getList().orElseGet(() -> new ArrayList<>());

当您需要以旧的方式访问某个对象的字段时,还有更多的样板代码。假设您有一个type类型的对象用户它有一个类型字段地址使用字段s街道类型的字符串。出于某种原因,您需要返回字段,如果存在,则使用默认值:

用户User = getUser();if (user != null) {Address Address = user. getaddress ();if (address != null) {String street = address. getstreet ();if (street != null) {return street;}}}返回"未指定";

这可以用可选:

可选 User =可选. ofnullable (getUser());String result = user .map(user::getAddress) .map(Address::getStreet) .orElse("未指定");

在本例中,我们使用map ()方法转换调用的结果getAdress ()可选<地址>getStreet ()可选<字符串>。如果这些方法中的任何一个返回map ()方法将返回一个空可选的。

假设我们的getter返回可选< T >。所以,我们应该用flatMap ()方法,而不是map ():

可选 OptionalUser =可选。ofnullable (getOptionalUser());String result = optionalUser .flatMap(optionalUser::getAddress) .flatMap(OptionalAddress::getStreet) .orElse("未指定");

的另一个用例可选正在改变肺水肿与另一个例外。所以,正如我们之前所做的,让我们尝试用java 8之前的风格来做这些:

字符串值= null;String result = "";try {result = value.toUpperCase();} catch (NullPointerException异常){抛出新的CustomException();}

如果我们用可选<字符串>吗?答案更容易理解,也更简单:

字符串值= null;可选 valueOpt =可选. ofnullable (value);stringresult = valueOpt.orElseThrow(CustomException::new).toUpperCase();

请注意,如何使用和出于什么目的可选你的应用是一个严肃且有争议的设计决策,而解释它的所有利弊不在本文讨论范围之内。如果你感兴趣,你可以深入挖掘,在互联网上有很多有趣的文章专门讨论这个问题。这一个这另一个可能会很有帮助。

5.结论

在本文中,我们将简要讨论Java 8中一些有趣的新特性。

当然,还有许多其他的添加和改进,它们分布在许多Java 8 JDK包和类中。

但是,本文中说明的信息是探索和学习一些新特性的良好起点。金宝搏官网188be

最后,本文的所有源代码都已提供在GitHub。

下一个»
Java 9中的新特性
Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
本文评论关闭!