美文网首页
四、Optional类

四、Optional类

作者: 编程界的小学生 | 来源:发表于2017-04-03 13:52 被阅读0次

介绍
Optional<T>类是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好地表达这个概念,并且可以避免空指针异常。

常用API
Optional.of(T t):创建一个Optional实例,若为null,则会引起空指针
Optional.empty():创建一个空的Optional实例
Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例
isPresent():判断是否包含值
orElse(T t):如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
flatMap(Function mapper):与map类似,要求返回值必须是Optional

package com.chentongwei.java8.day06;

import java.util.Optional;

import org.junit.Test;

import com.chentongwei.java8.day05.Employee;

/**
 * 测试Optional
 * 
 * @author TongWei.Chen
 * @date 2017年4月3日13:25:37
 */
public class TestOptional {
    
    //of
    @Test
    public void test1() {
        Optional<Employee> op = Optional.of(new Employee());
        //正常输出
        System.out.println(op.get());
        
        Optional<Employee> op1 = Optional.of(null);
        //空指针异常
        System.out.println(op1.get());
    }
    
    //empty
    @Test
    public void test2() {
        Optional<Employee> op = Optional.empty();
        //java.util.NoSuchElementException
        //不会出现空指针异常
        System.out.println(op.get());
    }
    
    //ofNullable orElse orElseGet
    @Test
    public void test3() {
        Optional<Employee> op = Optional.ofNullable(new Employee());
        
        //如果有元素,不是空或null
        if(op.isPresent()) {
            System.out.println(op.get());
        }
        
        Employee emp = op.orElse(new Employee("张三"));
        System.out.println(emp);
        
        //与orElse区别在于他接收一个函数式接口,可以写自己逻辑,比如if true
        //返回A对象,else 返回B对象
        Employee emp2 = op.orElseGet(() -> new Employee());
        System.out.println(emp2);
    }
    
    //map flatMap
    @Test
    public void test4(){
        Optional<Employee> op = Optional.of(new Employee(101, "张三", 18, 9999.99));
        
        Optional<String> op2 = op.map(Employee :: getName);
        System.out.println(op2.get());
        
        Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));
        System.out.println(op3.get());
    }
    
    //需求:获取一个男人心中女神的名字
    public String getGodnessName(Man man){
        //防止出现空指针异常,需要各种判断
        if(man != null){
            Godness g = man.getGod();
            
            if(g != null){
                return g.getName();
            }
        }
        
        return "苍老师";
    }
    
    @Test
    public void test5() {
        Man man = new Man();
        String name = getGodnessName(man);
        System.out.println(name);
    }
    
    @Test
    public void test6() {
        Optional<Godness> godness = Optional.ofNullable(new Godness("林志玲"));
        Optional<NewMan> op = Optional.ofNullable(new NewMan(godness));
        String name = getGodnessName2(op);
        System.out.println(name);
    }
    
    public String getGodnessName2(Optional<NewMan> man) {
        return man.orElse(new NewMan())
                  .getGodness()
                  .orElse(new Godness("苍老师"))
                  .getName();
    }
}

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg

相关文章

  • 四、Optional类

    介绍Optional类是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Option...

  • Java 9 改进的 Optional 类

    Optional 类在 Java 8 中引入,Optional 类的引入很好的解决空指针异常。 Optional ...

  • Optional用法

    Optional用法 从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要...

  • Optional类

    Optional类为Java8新引入的一个类,Optional是一个可以为null的容器对象,Optional中的...

  • Optional类

    人可能有车,也可能没有车,因此将这个字段声明为Optional。车可能进行了保险,也可能没有保险,所以将这个字段声...

  • Optional 类

    Optional 类 声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!! 到目前为止,臭名昭著的...

  • optional类

    简介 首先我们需要明确的是它并 不是对 null 关键字的替代策略,而是对于 null 判定提供了一种更加优雅的实...

  • Optional类

    一、Optional类创建 二、常用方法

  • Optional类

  • Optional 类

网友评论

      本文标题:四、Optional类

      本文链接:https://www.haomeiwen.com/subject/edznottx.html