考虑一下我有一个简单的模型UserInfo和Passport:
public class UserInfo {
private int age;
private String passportId;
// getters, setters
}
public class Passport {
// empty
}
如果用户年龄大于20岁,我想查看他的护照,在Java7中,我可以这样做:
UserInfo userInfo = new UserInfo();
userInfo.setAge(22);
userInfo.setPassportId(null);
final Passport passport;
if (userInfo.getAge() > 20) {
if (userInfo.getPassportId() == null) {
throw new IllegalArgumentException("Set passport");
}
else {
passport = findPassportById(userInfo.getPassportId());
}
}
这很简单,但是我想使用Java8 Optional <T>。
如果只需要执行一个可为null的操作,则可选似乎非常方便:
但是当我尝试同时做这两种事情时,我会发现一些丑陋的东西:
String passportId = Optional.of(userInfo)
.filter(x -> x.getAge() > 20)
.map(UserInfo::getPassportId)
.orElseThrow(() -> new IllegalArgumentException("Set passport"));
final Passport passport;
// null checks again? I don't want to!
if (passportId != null) {
passport = findPassportById(passportId);
}
因此,有没有实践可以更干净地重构这种常见情况?
谢谢!
我认为那UserInfo
不是null
,所以将其包装为Optional
没有意义。您也不想在年龄低于20岁时继续。
还有一点要记住的是,要点Optional
是避免异常。如果passportId
是必不可少的财产,那么无论如何它都应该是强制性的(如果年龄> 20岁)。否则,您将首先处理损坏的数据。另一方面,如果不是强制性的,则抛出异常没有多大意义。
如果你不想让它强制性我建议作出Optional
的passportId
通过,可能直接UserInfo
本身。如果仍然需要常规的吸气剂,则可以使用属性的名称添加一个新方法(即使在JDK中,这也是常见的做法)。
public class UserInfo {
public String getPassportId() {...}
public Optional<String> passportId() {
return Optional.ofNullable(passportid);
}
...
if (userInfo.getAge() > 20) {
userInfo.passportId().ifPresent(...)
}
但是,如果您坚持要引发异常,则可以采用以下方式:
if (userInfo.getAge() > 20) {
Passport passport = userInfo.passportId()
.map(this::findPassport)
.orElseThrow(() -> new IllegalArgumentException("Set passport"));
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句