您的主要错误是您仍在使用更多程序性术语进行思考。这并不意味着对您作为一个人的批评,而仅仅是观察。用更多的功能性思维思考需要时间和实践,因此方法是现成的,看起来像是最明显的正确事物需要您的配合。您的第二个小错误是在方法内部创建Optional。Optional旨在帮助记录某些内容可能会或可能不会返回值的情况。您可能一无所获。
这使您确实编写了看起来清晰合理的完全清晰的代码,但是您被get和isPresent的邪恶双胞胎诱惑所吸引。
当然,问题很快就变成了“为什么存在并到达那里?”
这里很多人想念的一件事是isPresent(),它不是为那些完全掌握有用的lambda的人以及喜欢该功能的人编写的新代码编写的。
但是,它确实为我们带来了几(两个)好处,巨大好处,魅力四射的好处?
- 它简化了传统代码向新功能的过渡。
- 它简化了Optional的学习曲线。
第一个很简单。
假设您有一个如下所示的API:
public interface SnickersCounter {
/**
* Provides a proper count of how many snickers have been consumed in total.
*/
public SnickersCount howManySnickersHaveBeenEaten();
/**
* returns the last snickers eaten.<br>
* If no snickers have been eaten null is returned for contrived reasons.
*/
public Snickers lastConsumedSnickers();
}
并且您有一个使用此类的旧式类(填入空白):
Snickers lastSnickers = snickersCounter.lastConsumedSnickers();
if(null == lastSnickers) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers);
}
一个人为的例子可以肯定。但是在这里忍受我。
Java 8现在已经启动,我们正努力加入。因此,我们要做的一件事就是我们要用返回Optional的东西替换旧界面。为什么?因为正如其他人已经亲切地提到的那样:
这使人们不必猜测某些内容是否可以为null。
这已经被其他人指出。但是现在我们有一个问题。想象我们有(对不起,当我在一个无辜的方法上按下alt + F7时),在经过良好测试的旧代码中调用此方法的位置有46个,否则它将发挥出色的作用。现在,您必须更新所有这些。
这就是isPresent闪耀的地方。
因为现在:士力架lastSnickers = snickersCounter.lastConsumedSnickers(); if(null == lastSnickers){抛出新的NoSuchSnickersException(); }其他{Consumer.giveDiabetes(lastSnickers); }
变成:
Optional<Snickers> lastSnickers = snickersCounter.lastConsumedSnickers();
if(!lastSnickers.isPresent()) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers.get());
}
这是您可以给新进初级人员的一个简单更改:他可以做一些有用的事情,并且他将同时探索代码库。双赢。毕竟,类似于这种模式的东西非常普遍。现在,您不必重写代码即可使用lambda或其他任何东西。(在这种情况下,这是微不足道的,但是我想起了一些例子,在这些例子中,读者很难做到这一点。)
请注意,这意味着您执行此操作的方法实质上是一种无需处理昂贵的重写即可处理遗留代码的方法。那么新代码呢?
好吧,在您的情况下,您只想打印一些内容,您只需执行以下操作:
snickersCounter.lastConsumedSnickers()。ifPresent(System.out :: println);
这很简单,也很清楚。然后慢慢浮出水面的是,存在get()和isPresent()的用例。它们的存在使您可以机械地修改现有代码以使用较新的类型,而不必考虑太多。因此,您在做的事情在以下方面会被误导:
- 您正在调用一个可能返回null的方法。正确的想法是该方法返回null。
- 您使用的是旧的创可贴方法来处理此可选方法,而不是使用包含lambda幻想的美味的新方法。
如果您确实想将Optional用作简单的null安全检查,那么您应该做的就是:
new Optional.ofNullable(employeeServive.getEmployee())
.map(Employee::getId)
.ifPresent(System.out::println);
当然,它的漂亮版本如下所示:
employeeService.getEmployee()
.map(Employee::getId)
.ifPresent(System.out::println);
顺便说一句,尽管它不是必需的,但我还是建议您在每个操作中使用新行,以便于阅读。一周的任何一天都易于阅读和理解,使节拍变得简洁。
当然,这是一个非常简单的示例,可以很容易地理解我们尝试做的所有事情。在现实生活中并不总是那么简单。但是请注意,在此示例中,我们要表达的是我们的意图。我们想要获取员工,获取其ID,并在可能的情况下进行打印。这是Optional的第二大胜利。它使我们可以创建更清晰的代码。我也确实认为,做一些事情,例如制作一种可以处理很多事情的方法,以便您可以将其提供给地图,通常是个好主意。