您已经编程了多少时间, nullpointerexception 是您面临的最令人沮丧的问题之一。
可选类是在Java 8中引入的,以解决 nullpointerexception 的问题。
java.util.optional 类是一种通用类型类,仅包含一个类型 t 的值。它的目的是为可以无效的类型T的参考对象提供更安全的替代方法。但是只有在使用正确的方式时,可选对象才安全。
让我们看看可以创建可选对象的方式
空的可选
使用 optional.empty()我们可以创建一个空无任何类型的可选对象
//returning a empty optional of type string
public static Optional<String> emptyOptional(){
return Optional.empty();
}
//or
Optional<String> str = Optional.empty();
可选的可选
使用可选的nullable()方法,我们可以创建可选的可选对象。这些对象可以为null或其中的值
public static Optional<Wallet> getWallet(){
return Optional.ofNullable(null);
}
不可删除的可选
使用 optional.of()方法我们可以创建不可删除的可选对象。
public static Optional<Wallet> getWallet(){
return Optional.of(new Wallet(100));
}
现在让我们看一下可选类中存在的不同方法,我们可以利用这些方法来编写促进无效安全的干净代码。
如果存在或抛出 nosuchelementException
,则可选类中的 get()方法获取值例如,假设我们有一个对象钱包用私人提交的钱。为了获得货币价值,我们可以按以下
进行
//normal way to get money
int savings = wallet.getMoney();
//when wallet object is wrapped in a optional
int savings = optionalWallet.get().getMoney();
如果钱包对象无效,第二种方法比第一种方法更安全,因为它thorws nosuchelementException 而不是 nullpoInterexception
我们可以使用 iSpresent()方法来改善第二种方式,该方法返回布尔值是否存在值。
List<Integer> savings = new ArrayList();
if(optionalWallet.isPresent()){
savings.add(optionalWallet.get().getMoney());
}
,但与此同时,这种做法的冗长并不比检查不进行null。
List<Integer> savings = new ArrayList();
if(wallet != null){
savings .add(wallet.getMoney());
}
为了使代码更加简洁明了,我们可以使用 ifpresent()方法,该方法需要消费者或可运行的人或两者兼而有之。使用 ifpresent()我们可以消耗正确的值或产生替代方案。让我们看看
List<Integer> savings = new ArrayList();
optionalWallet.ifPresent(wallet -> savings.add(wallet.getMoney()));
在上面的示例中,只有在钱包不为null时,即在出现时才添加资金。
如果我们将钱包本身添加到列表
//using lambda
List<Wallet> wallets = new ArrayList<>();
optionalWallet.ifPresent(wallet -> wallets.add(wallet));
//you can also use method reference
List<Wallet> wallets = new ArrayList<>();
optionalWallet.ifPresent(wallets::add);
您可以看到,它比一开始的示例要好得多。
可以在某些情况下使用 orelelse()方法时,您可能希望有一个默认值,而当可选的null为null时,我们可以产生替代值。让我们看看一个示例
List<Wallet> wallets = new ArrayList<>();
Wallet wallet = optionalWallet.orElse(new Wallet(0));
wallets.add(wallet);
在上面的示例中,如果可选WALLET包含一个值,则分配给钱包变量的值,如果不是分配了值0的默认钱包。 Orelse()方法可以与任何其他类型一起使用以产生默认值。
您还可以在 Orelseget()方法中调用一个代码块来计算默认值
//calculating a default value
Wallet wallet = optionalWallet.orElseGet(() -> {
int randomAmount = (int) (Math.random() * 500); // Generating a random amount between 0 and 500
return new Wallet(randomAmount);
});
使用Spring Boot应用程序和数据库时,当我们进行选择查询以获取用户时,这是一个很好的做法,可以将用户对象包裹在可选的情况下,然后我们可以做类似的事情
//Getting the user from database
Optional<User> findUserById(String id);
//Calling the find user method
User user = findUserById(id)
.orElseThrow(UserNotFoundException::new);
在上面的示例中,您可以看到,我们不必检查用户是否不进行检查。如果数据库中存在用户,我们将获得用户,如果不是,我们会优雅地投掷异常。
这些是在Java中使用选项的一些更好方法。如果您发现此有用的帖子,请考虑以后并留下拍手。