Java可选:正确处理空值

Java 8引入了 Optional该类,以使对null的处理不那么容易出错。例如,以下用于选择幸运名的程序的空检查为:
public static final List NAMES = Arrays.asList(“Rita”, “Gita”, “Nita”, “Ritesh”, “Nitesh”, “Ganesh”, “Yogen”, “Prateema”);
public String pickLuckyNameOldWay(final List names, final String startingLetter) {
String luckyName = null;
for (String name : names) {
if (name.startsWith(startingLetter)) {
luckyName = name;
break;
}
}
return luckyName != null ? luckyName : “No lucky name found”;
}

可以将空检查替换为 Optional 类方法 isPresent() ,如下所示:
public String pickLuckyNameWIsPresent(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
return luckyName.isPresent() ? luckyName.get() : “No lucky name found”;
}

但是,请注意,编写并不比以下简单:
return luckyName != null ? luckyName : “No lucky name found”;

在 Optional 类,但是,支持优于检查空的其他技术。上面的代码可以用如下orElse() 方法重写 如下:
public String pickLuckyNameWOrElse(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
return luckyName.orElse(“No lucky name found”);
}

orElse() 在条件为“ 如果X为空,则填充X.返回X. ” 的情况下调用该方法 ,以便在不存在可选值的情况下可以设置默认值。
还有另一种方法称为 ifPresent(Function)。您可以使用此方法来调用操作并完全跳过null大小写。例如,如果满足以下条件,则下面的程序在这种情况下会打印一条消息:
public static void pickLuckyNameOldWay(final List names, final String startingLetter) {
String luckyName = null;
for (String name : names) {
if (name.startsWith(startingLetter)) {
luckyName = name;
break;
}
}
if (luckyName != null) {
postMessage(luckyName);
}
}
public static void postMessage(final String winnerName) {
System.out.println(String.format(“Congratulations, %s!”, winnerName));
}

可以用重写 ifPresent() , 如下所示。以更直观的方式,如:
public static void pickLuckyNameNewWay(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
luckyName.ifPresent(OptionalIfPresent::postMessage);
}

如果我们想在找不到名称的情况下抛出异常,则可能是这样的:
public String pickLuckyNameOldWay(final List names, final String startingLetter) {
String luckyName = null;
// … same code here
if (luckyName == null) {
throw new NotFoundException(“There is no name starting with letter.”);
}
return luckyName;
}

可以有意义地替换 orElseThrow 为:
public String pickLuckyNameWOrElse(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
return luckyName.orElseThrow(() -> new NotFoundException(“There is no name starting with letter.”));
}

类中还有其他许多方法 Optional 可以null 更正确地处理 。您可以阅读Java 8中的 Optional速查表。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。在这里插入图片描述

发布了252 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhaozihao594/article/details/105229479