首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用optionals重写if else null检查

基础概念

Optional 是 Java 8 引入的一个容器对象,用于表示一个值存在或不存在。它可以用来避免空指针异常(NullPointerException),并使代码更加清晰和安全。

优势

  1. 避免空指针异常:通过显式地处理可能为空的值,减少运行时错误。
  2. 代码可读性:使用 Optional 可以使代码意图更加明确,减少冗长的 if-else 检查。
  3. 函数式编程Optional 提供了一些函数式方法,如 mapflatMapfilterorElse,使得代码更加简洁和易读。

类型

Optional 有两种类型:

  • Optional<T>:表示一个值可能存在也可能不存在。
  • OptionalIntOptionalLongOptionalDouble:分别表示基本数据类型的可选值。

应用场景

当需要处理可能为空的值时,可以使用 Optional。例如,从数据库查询数据、从外部API获取数据等。

示例代码

假设我们有一个方法 findUserById,它可能返回一个用户对象或 null

代码语言:txt
复制
public class User {
    private String name;
    // getters and setters
}

public class UserService {
    public User findUserById(int id) {
        // 模拟从数据库查询用户
        return null; // 或者返回一个 User 对象
    }
}

使用 Optional 重写 if-else 检查:

代码语言:txt
复制
public class UserService {
    public Optional<User> findUserById(int id) {
        // 模拟从数据库查询用户
        User user = null; // 或者返回一个 User 对象
        return Optional.ofNullable(user);
    }

    public void printUserName(int id) {
        Optional<User> optionalUser = findUserById(id);
        String userName = optionalUser.map(User::getName).orElse("Unknown");
        System.out.println("User name: " + userName);
    }
}

解释

  1. Optional.ofNullable(user):将可能为空的 user 包装成 Optional 对象。
  2. optionalUser.map(User::getName):如果 optionalUser 存在,则调用 User::getName 方法获取用户名,并将其包装成新的 Optional 对象。
  3. orElse("Unknown"):如果 optionalUser 不存在,则返回默认值 "Unknown"

参考链接

通过这种方式,我们可以避免显式的 if-else 检查,使代码更加简洁和安全。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用Optional来减少null检查

由来 平常我们使用null检查在项目中简直太常见了,从数据库中查询到的数据可能不存在返回null,service中处理中发现不存在返回一个null,在互相调用的时候每次都需要做(if obj !...以往的null检查方式 用户在新注册之后可能是没有收货地址的,因此user.getAddr()返回null,再调用就会给你点颜色看看。...= null){ return addr.getProvince(); } } return null; } 或者使用防御式编程方式(以前我喜欢的编程方式),在检查到...Java1.8借鉴了Haskell和Scala中方式,提供了一个Optional类来帮助程序员避免null检查。...可以看到我们并未改变接口参数和返回值,但在内部处理上经过重写我们已经简化了非常多的代码,逻辑也变得清晰,更具有可读性。 为何可以如此写呢?

87640

如何在Java和Swift中避免空引用异常?

实现这个任务的一种方法是: 上面的代码,如果userRepository不是null,则此代码不会抛出NullPointerException。但是,代码中有三个if语句用于执行null检查。...Nullable Chaining 与Java中的Optionals 一样,Kotlin中的可空值也可以通过使用例如null-safe调用操作符进行链接。...一个保护语句只包含一个条件和/或一个未包装的语句和一个强制的else块。编译器通过使用控制传输语句(返回、抛出、中断、继续)或调用从未返回类型的方法来确保这个else块退出其封闭范围。...,建议使用Java Optionals作为API的返回类型。...这样,将鼓励API的客户端检查返回值是否存在,并通过使用可选的API编写更干净的代码。然而,最大的缺陷之一是Java不能强制程序员不分配null值。

2.7K30
  • 使用 Java8 中的 Optional 类来消除代码中的 null 检查

    本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。 本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。...01 避免使用 null 检查 作为 Java 开发人员,几乎所有人都遇到过 NullPointerException 异常,大多数人遇到 NullPointerException 异常时都会在异常出现的地方加上...= null) { // TODO ... } else { // TODO ... } 当我们从之前版本切换到 Java8 的时候,不应该还按照之前的思维方式处理 null 值,Java8...而为了调用 get() 方法而使用 isPresent() 方法作为空值检查,这种做法与传统的用 if 语句块做空值检查没有任何区别。...= null) { return userName.toUpperCase(); } else { return null; } } else {

    35930

    超实用的ios面试技巧,90%的人都不知道……

    简单聊一下概念和使用 Class反射 通过类名的字符串形式实例化对象 Class class NSClassFromString@(@”student”); Student *stu = [[class...{ NSLog(@"%@",path); [manager removeItemAtPath:filePath error:nil]; } }else{...Optionals类似于Objective-C中指向nil的指针、但是适用于所有的数据类型,而非仅仅局限于类,Optionals相比于Objective-C中nil指针更加安全简明,并且也是Swift诸多最大功能的核心...当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用set方法 ②如果set方法不存在,就会查找与key相同名称并且带下划线的成员属性,如果有...这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。 ●KVO的底层实现? - kvo基于runtime机制实现。

    79970

    Effective Java(第三版)-学习笔记

    5.如果x是不为null的引用对象,则x.equals(null)==false。 一般重写equals方法时需要先对比引用,再对比类型,然后挨个对比成员变量的值是否相等。...关于泛型类型的获取,可参考: java Type 详解 Java泛型的学习和使用 消除每一个未检查的警告 每一个未检查的waring都是一个潜在的运行时类型转换异常,尽量保证代码不提示这种异常...return list.toArray(EMPTY_OBJECT_ARRAY); } 慎重返回optionals Optional是一个不可变容器,可以持有个非null T对象引用或者没有...可恢复条件下发生异常,使用检查异常,程序错误使用运行时异常 不要使用errors,errors是JVM表明资源缺乏等导致无法运行用的。...定义所有未检查的异常应该继承RuntimeException。 避免不必要的检查异常 有些异常需要抛给调用者解决。 优先使用Java定义的异常 大家都懂的异常,简单明了。

    1.1K10

    Java 8 新特性|java.util.Optional 类

    Optional 类是一个容器,用于表示可能包含也可能不包含非 null 值。如果存在值,isPresent() 方法将返回 true,get() 将返回该值。...Optional 类提供了许多方法用于处理 「 可用 」 或 「 不可用 」 ,而不是简单的检查空值情况。...NoSuchElementException 异常 public T get() //如果值存在,则返回当前值的哈希值,如果不存在值,则返回 0 public int hashCode() //如果值存在,则使用该值作为参数调用方法...> consumer) //如果值存在则返回 true ,否则返回 false public boolean isPresent() //如果存在值,则将传递的 map 函数应用于该值,如果结果为非 null...,则返回描述结果的 Optionals public Optional map(Function<?

    40710

    SwiftUI:alert() 和 sheet() 与可选值一起使用

    SwiftUI有两种创建警报和表单的方式,到目前为止,我们仅使用一种方法:绑定到布尔值,该布尔值在变为 true 时显示 Alert 或 Sheet。...第二种方法并不经常使用,但是在您需要的时候它确实有用:您可以使用可选的Identifiable对象作为条件,并且当该对象具有值时将显示 Alert 或Sheet 。...它的闭包将为您提供用于条件的非可选值,因此您可以安全地使用它。...如果我们要使用旧的.alert(isPresente:)修饰符来重写上述代码,它将看起来像这样: struct ContentView: View { @State private var selectedUser...参考 Alert弹窗 SwiftUI:ActionSheet 弹窗 SwiftUI:Sheet 视图 译自 Using alert() and sheet() with optionals

    2.4K40

    Effective-java-读书笔记之方法

    第49条 检查参数的有效性方法的参数限制, 应该在文档中指明, 并且在方法体的开头处检查参数, 以强制施加这些限制.对于公有的方法, 要用Javadoc的@throws标签在文档中说明违反参数值限制时会抛出的异常...(assertion)来检查它们的参数.....在定义参数数目不定的方法时, 可变参数是一种很方便的方式, 但是它们不应该被过度滥用.第54条 返回零长度的数组或集合, 而不是null返回类型为数组或集合的方法, 应该返回一个零长度的数组或者集合,...(例如: Collections.emtpySet).第55条 明智地返回optionals在Java 8之前, 当一个方法无法返回值的时候有两种选择: 返回null或者抛出异常.Java 8推出了一个新的解决方案...(不过通常可以用上面的各种方法更加优雅地解决问题.)也不是所有的类型都可以从Optional受益, 容器类型(collections, maps, streams, arrays)和optionals不应该再用

    42450
    领券