java8 Optional使用指南

使用指南

创建

Optional只有私有构造方法。实例创造方法有:

    @Test
    public void test1() {
    
    
        // 以下两个等价
        System.out.println(Optional.ofNullable(null));
        System.out.println(Optional.empty());

        // 明确是非空的采用这个
        System.out.println(Optional.of("not null"));
    }

输出:

Optional.empty

Optional.empty

Optional[not null]

直接get

@Test
public void test2() {
    
    
    Optional<String> opt = Optional.ofNullable("12345");
    System.out.println(opt.get());//12345

    Optional.empty().get();//java.util.NoSuchElementException: No value present
}

ifPresent

@Test
public void test2() {
    
    
    Optional<String> opt = Optional.ofNullable("12345");
    opt.ifPresent(System.out::println); // 12345
}

orElse相关

@Test
public void test3() {
    
    
    Optional<String> opt = Optional.ofNullable(null);
    System.out.println(opt.orElse("hello")); // 输出hello
    System.out.println(opt.orElseGet(() -> new String("by create")));// 输出by create
}

存在则直接输出,不存在则输出else的内容,elseGet使用函数式编程的方法延迟对象的创建,对于复杂对象可以使用orElseGet,性能会更好些。

自定义异常

@Test
public void test4() {
    
    
    Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("自定义异常"));// 抛出异常
}

map和flatMap

@Test
public void tes4() {
    
    
    Optional<String> opt = Optional.ofNullable("hello world");
    System.out.println(opt.flatMap(i -> Optional.ofNullable("bad"))); //Optional[bad]
    System.out.println(opt.map(i -> "bad"));//Optional[bad]
}

没啥区别,map不需要在再进行封装罢了。

总结

Optional中用到的设计模式很简单,就是包装器模式,将value包住,提供了一系列避免空指针的方案。

注意: Optional类没有实现Serializable

参考文档

  1. jdk官方文档

猜你喜欢

转载自blog.csdn.net/qq_38619183/article/details/112334433