正确使用Java的可选方式
#编程 #教程 #java #springboot

您已经编程了多少时间, nullpointerexception 是您面临的最令人沮丧的问题之一。

Image description
可选类是在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中使用选项的一些更好方法。如果您发现此有用的帖子,请考虑以后并留下拍手。