Java8-Optional类

这个类实际中不知道各位开发同学,使用的频率怎么样,目前我在工作中使用的频率一般。

不过还是介绍下这个类:

废话不多说,直接上代码:


/**
 * Optional 容器类的常用方法:
 * Optional.of(T t):创建一个Optional 实例
 * 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()
 * flapMap(Function mapper):与map类似,要求返回值必须是Optional
 *
 */
public class TestOptional {

    @Test
    public void test8(){
        Optional<Student> op = Optional.ofNullable(new Student("Alfred","M","20"));
        Optional<String> str = op.flatMap(e->Optional.of(e.getName()));
        System.out.println(str);//输出结果:Optional[Alfred]
        System.out.println(str.get());//输出结果:Alfred
    }

    @Test
    public void test7(){
        Optional<Student> op = Optional.ofNullable(new Student("Alfred","M","20"));
        Optional<String> str=op.map(e->e.getName());
        System.out.println(str);//输出结果: Optional[Alfred]
        System.out.println(str.get());//输出结果: Alfred
    }

    @Test
    public void test6(){
        Optional<Student> op = Optional.ofNullable(null);
        Student stu = op.orElseGet(()-> new Student());
        System.out.println(stu);//输出结果:Student{name='null', sex='null', age='null'}
    }

    @Test
    public void test5(){
        Optional<Student> op = Optional.ofNullable(null);
        Student stu =op.orElse(new Student("Alfred","M","20"));
        System.out.println(stu);//输出结果:Student{name='Alfred', sex='M', age='20'}
    }

    @Test
    public void test4(){
        Optional<Student> op = Optional.ofNullable(new Student());
        if(op.isPresent()){
            //传一个Optional 对象
            System.out.println(op.get());//输出结果:Student{name='null', sex='null', age='null'}
        }
    }

    @Test
    public void test3(){
        Optional<Student> op = Optional.ofNullable(new Student());
        System.out.println(op.get());//输出结果:Student{name='null', sex='null', age='null'}
    }

    @Test
    public void test2(){
        Optional<Student> op = Optional.empty();
        System.out.println(op.get());//输出结果:java.util.NoSuchElementException: No value present  没有值
    }

    @Test
    public void test1(){
        Optional<Student> op = Optional.of(new Student());
        Student stu = op.get();
        System.out.println(stu);//输出结果:Student{name='null', sex='null', age='null'}
    }

    @Test
    public void test1_1(){
        Optional<Student> op = Optional.of(null);//通过这种方式可以快速锁定空指针异常
        Student stu = op.get();
        System.out.println(stu);//输出结果:java.lang.NullPointerException
    }
}

实际中,举个男人和车的例子:

先创建两个类,一个男人类,一个车类

public class Car {
    private String idCard;

    public Car(String idCard) {
        this.idCard = idCard;
    }

    public Car() {
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    @Override
    public String toString() {
        return "Car{" +
                "idCard='" + idCard + '\'' +
                '}';
    }
}

public class Man {
    private Car car;
    private String name;

    public Man() {
    }

    public Man(Car car, String name) {
        this.car = car;
        this.name = name;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Man{" +
                "car=" + car +
                ", name='" + name + '\'' +
                '}';
    }
}

改进后的新的NewMan类:


public class NewMan {
    private Optional<Car> car = Optional.empty();

    public NewMan(Optional<Car> car) {
        this.car = car;
    }

    public NewMan() {
    }

    public Optional<Car> getCar() {
        return car;
    }

    public void setCar(Optional<Car> car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "NewMan{" +
                "car=" + car +
                '}';
    }
}

最后的测试结果如下:

    @Test
    public void test10(){
        //需求:获取每个男人的车的拍照
        Man man = new Man();
        String str = getManIdCard(man);
        System.out.println(str);//输出结果:java.lang.NullPointerException
    }

    @Test
    public void test11(){
        //需求:获取每个男人的车的拍照
        Man man = new Man();
        String str = getManIdCard1(man);
        System.out.println(str);//输出结果:11路单车
    }

    @Test
    public void test12(){
        //需求:获取每个男人的车的拍照
        Optional<NewMan> man = Optional.ofNullable(null);
        String str = getNewManIdCard(man);
        System.out.println(str);//输出结果:11路单车
    }

    @Test
    public void test13(){
        //需求:获取每个男人的车的拍照
        Optional<NewMan> man = Optional.ofNullable(new NewMan());
        String str = getNewManIdCard(man);
        System.out.println(str);//输出结果:11路单车
    }

    public String getManIdCard(Man man){
        return man.getCar().getIdCard();
    }

    public String getManIdCard1(Man man){
        if(man != null){
            Car car = man.getCar();
            if(car != null){
                return car.getIdCard();
            }
        }
        return "11路单车";
    }

    public String getNewManIdCard(Optional<NewMan> man){
        return man.orElse(new NewMan())
                .getCar()
                .orElse(new Car("11路单车"))
                .getIdCard();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值