Java优雅判空——Optional

初始化

Optional提供了三个初始化方法:

@SpringBootTest
public class OptionalTest {

    @Test
    public void testOptional() {
	    Optional.empty();
        Optional.ofNullable(null);
        Optional.of(null);
    }
}

empty返回一个空的Optional对象。
of遇到空会报错,但是使用Optional的目的就是防止空指针,所以一般使用ofNullable较多。
在这里插入图片描述

ifPresent

ifPresent——如果存在则xxx

public void testOptional() {
        Student student = new Student();
        student.setName("feng");
        student.setAge(18);
        Optional.of(student);

        // 普通做法
        if(student !=  null){
            System.out.println(student.getName());
        }
        
        // Optional普通用法
        Optional<Student> optional = Optional.ofNullable(student);
        if(optional.isPresent()){
            Student student1 = optional.get();
            System.out.println(student1.getName());
        }

        // 正确用法
        optional.map(new Function<Student, String>() {
            @Override
            public String apply(Student student) {
                return student.getName();
            }
        }).ifPresent(System.out::println);

		// 简化
		optional.map(Student::getName).ifPresent(System.out::println);
    }

orElse和orElseGet

如果没有对象,则调用一个创建对象的方法。
orElse类似于饿汉式,如果当前对象不为空就使用当前的对象,如果为空则调用方法去创建一个新对象。
orElseGet类似于懒汉式,只有当前对象为空才会去调用,通常使用orElseGet较多。

当前对象不为空:

    public void testOptional() {
        Student student = new Student();
        student.setName("feng");
        student.setAge(18);
        Optional<Student> optional = Optional.ofNullable(student);
        Student student1 = optional.orElse(createStudent());
        // orElseGet接收一个Suppilier,一个匿名内部类,调用get方法处理逻辑
        Student student2 = optional.orElseGet(new Supplier<Student>() {
            @Override
            public Student get() {
                return createStudent();
            }
        });
    }

    private Student createStudent(){
        System.out.println("create student");
        return new Student();
    }

在这里插入图片描述

当前对象为空:

    public void testOptional() {
        Student student = null;
        Optional<Student> optional = Optional.ofNullable(student);
        Student student1 = optional.orElse(createStudent());
        // orElseGet接收一个Suppilier,一个匿名内部类,调用get方法处理逻辑
        Student student2 = optional.orElseGet(new Supplier<Student>() {
            @Override
            public Student get() {
                return createStudent();
            }
        });
    }

    private Student createStudent(){
        System.out.println("create student");
        return new Student();
    }

在这里插入图片描述

过滤

	public void testOptional() {
        Student student = new Student();
        student.setName("feng");
        student.setAge(18);
        Optional<Student> optional = Optional.ofNullable(student);
        optional.filter(student1 -> student1.getAge() > 1).ifPresent(student1 -> System.out.println(student1.getAge()));
    }

map和flatMap

Optional是Java中用于处理可能包含或不包含值的容器类。Optional提供了一些方法来对这些值进行操作,其中包括mapflatMap

  1. Optional.map
    • map方法用于在Optional包含值的情况下,对其进行转换或操作。
    • 如果Optional包含一个值,map会将这个值传递给提供的函数,并返回一个包含转换结果的新Optional
    • 如果Optional为空,map不执行任何操作,直接返回一个空Optional
    • map的签名如下:<U> Optional<U> map(Function<? super T, ? extends U> mapper)
Optional<String> optional = Optional.of("Hello");
Optional<Integer> lengthOptional = optional.map(s -> s.length());

在上面的例子中,optional包含一个字符串值"Hello",map方法将字符串长度计算并返回一个新的Optional包含计算结果,即一个整数。

  1. Optional.flatMap
    • flatMap方法用于在Optional包含值的情况下,进行一种扁平映射,它期望传入的函数返回另一个Optional
    • 如果Optional包含一个值,flatMap会将这个值传递给提供的函数,该函数返回一个Optional,然后flatMap返回这个新的Optional
    • 如果Optional为空,flatMap不执行任何操作,直接返回一个空Optional
    • flatMap的签名如下:<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
Optional<String> optional = Optional.of("Hello");
Optional<Integer> lengthOptional = optional.flatMap(s -> Optional.of(s.length()));

在上面的例子中,optional包含一个字符串值"Hello",flatMap方法将字符串长度计算并返回一个新的Optional包含计算结果,即一个整数。注意,flatMap函数返回的是Optional<Integer>,而不是Optional<Optional<Integer>>,这是因为flatMap会自动将嵌套的Optional展平为单层。

总结:

  • map用于对包含的值进行转换,并返回新的Optional
  • flatMap用于对包含的值进行扁平映射,并返回一个新的Optional,通常用于解决嵌套Optional的问题。

整体使用

// 普通
public void before8(List<Student> Students) {
    for (Student student:Students) {
        if (student != null){
            if (student.getAge() > 18){
                Integer score = student.getScore();
                if (score != null && score > 80){
                    System.out.println(student.getName());
                }
            }
        }
    }
}



//1 
public void after8(List<Student> students) {
   students.stream()
           .filter(Objects::nonNull) // 过滤掉空的学生对象
           .filter(student -> student.getAge() > 18) // 按年龄过滤
           .map(Student::getScore) // 映射为分数
           .filter(score -> score != null && score > 80) // 按分数过滤
           .map(Student::getName) // 映射为姓名
           .ifPresent(System.out::println); // 如果存在姓名则打印
}

	public void after8(List<Student> Students) {
        for (Student student:Students) {
            Optional<Student> studentOptional = Optional.of(student);
			
// 2
         Integer sorce = studentOptional
                 .filter(s -> s.getAge() > 18)
                 .map(Student::getScore)
                 .orElse(0);//.orElse(0)返回一个默认值,防止控空指针  
         if (sorce > 80){
             System.out.println(student.getName());
         }


// 3
         String name = studentOptional
                 .filter(s -> s.getAge() >= 18)
                 .filter(s -> s.getScore() > 80)
                 .map(Student::getName)
                 .orElse("wu");//.orElse(0)返回一个默认值,防止控空指针
         System.out.println(name);
     }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 中,你可以使用 `Optional` 类来进行空值判断,以避免出现空指针异常。下面是一些常见的使用方法: 1. 创建一个 Optional 对象: ```java Optional<String> optionalValue = Optional.of("Hello World"); ``` 在上述示例中,我们使用 `Optional.of()` 方法来创建一个包含非空值的 `Optional` 对象。 2. 判断 Optional 对象是否包含值: ```java if (optionalValue.isPresent()) { // Optional 对象包含值 String value = optionalValue.get(); // 进行相应的处理 } else { // Optional 对象为空 // 进行相应的处理 } ``` 使用 `isPresent()` 方法可以检查 `Optional` 对象是否包含值。如果包含值,可以使用 `get()` 方法获取该值。 3. 使用默认值: ```java String value = optionalValue.orElse("Default Value"); ``` 使用 `orElse()` 方法可以获取 `Optional` 对象中的值,如果值不存在,则返回默认值。 4. 使用函数式编程风格: ```java optionalValue.ifPresent(val -> System.out.println("Value: " + val)); ``` 使用 `ifPresent()` 方法可以在 `Optional` 对象包含值时执行相应的操作。在上述示例中,我们使用 lambda 表达式打印值。 这些是使用 `Optional` 类进行空值判断的一些常见方法。需要注意的是,使用 `Optional` 并不是解决所有空指针异常的唯一方法,它主要用于处理可能为空的返回值或变量。在代码中的其他地方,仍然需要遵循良好的空值处理实践,以确保代码的健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我顶得了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值