Optional 类介绍及使用---jdk8新增类

大家可以自己打开 Optional类看里面的方法,及文档介绍,更详细

目录

1.  Optional类方法介绍及简单使用

 of

ofNullable

get

isPresent

map

flatMap

orElse

orElseGet

orElseThrow

2.  Optional类场景使用


基本类

import lombok.Data;

import java.util.Optional;


@Data
public class User {

    private String name;
    private Integer age;
    private Address address;

//    public Optional<Address> getAddress() {
//        return Optional.ofNullable(address);
//    }

    public User() {
        System.out.println("ddd");
    }
}
import lombok.Data;

import java.util.Optional;


@Data
public class Address {
    private String cityName;

//    public Optional<String> getCityName() {
//        return  Optional.ofNullable(cityName);
//    }
}

1.  Optional类方法介绍及简单使用

 of

方法:包装一个对象,且对象不能为空;如果是空对象,会跑异常

使用:

private static void test_of() {
        User user = new User();
        Optional.of(user);
    }

ofNullable


方法介绍:包装一个可以为空的对象
使用:此方法单独使用没有意义,需要配合其他方法使用。比如orElse、orElseGet、isPresent

private static void test_ofNullAble() {
        User user = null;
        Optional.of(user);
    }

get

方法介绍: 获取 Optional内的值。

使用:

private static void test_get() {
        User user2 = new User();
        User user3 = Optional.of(user2).get();
        System.out.println(user2==user3); //true
    }

isPresent

方法介绍:返回被包装的值是否为空;

使用:

private static void test_isPresent() {
        User user1 = null;
        User user2 = new User();
//使用of方法会报错,因为user1是null
        boolean u1 = Optional.ofNullable(user1).isPresent();
        boolean u2 = Optional.ofNullable(user2).isPresent();
        //false
        System.out.println(u1);
        //true
        System.out.println(u2);
    }

map

方法介绍:值转换,

使用:

 private static void test_map() {
        User user1 = new User();
        User user2 = new User();
        user2.setName("zhandan");
        // 取到null值,如果再进行别的操作,比如name1.equals("aa");就会报空指针
        String name1 = Optional.ofNullable(user1).map(User::getName).get();
        // 取到lisi
        String name11 = Optional.ofNullable(user1).map(User::getName).orElse("lisi");
        // 取到getlisi,orElseGet需要传一个lambda表达式
        String name111 = Optional.ofNullable(user1).map(User::getName).orElseGet(()->"getlisi");
        // 直接获取user2对象中name的值
        String name2 = Optional.ofNullable(user2).map(User::getName).get();
    }

flatMap

方法介绍:转化的值必须是不为null;否则报错

private static void test_flatMap() {
        User user1 = new User();
        user1.setAddress(new Address());
        // 先将user1包装进取,进行flatMap方法时,判断user1是否为空,为空返回null;不为空获取address。
        // 这就少了if判断
        Address address = Optional.ofNullable(user1).flatMap(User::getAddress).get();
    }

orElse

介绍: 

orElseGet

orElseThrow

介绍:Optional内值为空会抛异常

2.  Optional类场景使用

获取user对象中address的cityname的值,

普通写法

private static String getCityname() {
        User user = new User();
        if(user != null){
            Address address = user.getAddress();
            if(address!=null){
                String cityName = address.getCityName();
                return cityName;
            }
        }
        return null;
    }

采用 Optional写法:

private static void test_getCityName() {
        User user = new User();
        String cityName = Optional.of(user).map(User::getAddress).map(Address::getCityName).orElse(null);
        // 这个方法,如果user或者address或者cityName有一个为空就报错。
        String cityNameError = Optional.of(user).map(User::getAddress).map(Address::getCityName).get();
        System.out.println(cityName);
    }

新写法就少了很多的if判断,如果值为空想跑异常,就用下边这个,自己判断值为空抛自定义异常就用上边那个。

操作集合

private static void test_ListStream() {
        List<User> list = new ArrayList();
        User user1 = new User();
        user1.setName("11");
        User user2 = new User();
        user2.setName("22");
        User user3 = new User();
        user3.setName("33");
        list.add(user1);
        list.add(user2);
        list.add(user3);

        // 操作list.stream
        List<String> nameList = Optional.ofNullable(list).map(Collection::stream).orElseGet(Stream::empty).map(User::getName).collect(Collectors.toList());
        System.out.println(nameList);
    }

更多参考:

理解、学习与使用 Java 中的 Optional - 张伯雨 - 博客园从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非https://www.cnblogs.com/zhangboyu/p/7580262.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值