ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java8 Optional的使用

2022-07-04 18:05:24  阅读:155  来源: 互联网

标签:userInfoOptional isPresent System 使用 println Optional java8 out


什么是opitonal

opitonal类就是Java提供的为了解决大家平时判断对象是否为空用的,用 null!=obj 这样的方式存在的判断,Null Pointer Exception 空指针异常,同时opitonal的存在可以让代码更加简单,可读性跟高,代码写起来更高效.

在了解opitonal之前需要了解四大内置核心函数式接口 https://www.cnblogs.com/lwjQAQ/p/16321930.html

opitonal使用举例: Stream.findOne; Stream.findAll

optional提供三个获取实例的方法。

  • empty: 创建一个空的Optional实例
  • of: 创建一个Optional值为T的实例,必须不为null 否则直接报错
  • ofNullable: 若T不为null,创建Optional 实例,否则创建空实例
public static<T> Optional<T> empty() {
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

optional容器类的常用方法

  • isPresent() : 判断是否包含值
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t 默认值
  • orElseGet(Supplier s) : 如果调用对象包含值,返回该值,否则返回s获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function f): 与map类似,要求返回值必须是Optional
  • filter(Predicate p): 如果值存在并且满足提供的谓词,就返回包括该值的Optional对象;否则返回一个空的Optional对象
    @Test
    public void test() {
        UserInfo userInfo = null;
        Optional<UserInfo> userInfoOptional = Optional.ofNullable(userInfo);

        System.out.println(userInfoOptional.isPresent());
        if (userInfoOptional.isPresent()) {
            System.out.println(userInfoOptional.get());
        }

        // orElse返回默认值
        UserInfo ofElseUser = userInfoOptional.orElse(new UserInfo("罗文杰", 18, "12345"));
        System.out.println(ofElseUser);

        // 使用Supplier函数返回默认值
        UserInfo orElseGetUser = userInfoOptional.orElseGet(() -> new UserInfo("罗文杰", 18, "12345"));
        System.out.println(orElseGetUser);

        userInfo = new UserInfo("罗文杰", 18, "12345");
        userInfoOptional = Optional.ofNullable(userInfo);

        // map 重新构造返回值
        Optional<Object> optionalMap = userInfoOptional.map(item -> {
            item.setAge(24);
            return item;
        });
        if (optionalMap.isPresent()) {
            System.out.println(optionalMap.get());
        }

        // filter过滤
        Optional<UserInfo> userInfoOptionalFilter = userInfoOptional.filter(item -> item.getAge() <= 18);
        if (userInfoOptionalFilter.isPresent()) {
            System.out.println(userInfoOptionalFilter.get());
        }
    }

    @Test
    public void test2() {
        UserInfo userInfo = null;
        Optional<UserInfo> userInfoOptional = Optional.of(userInfo);

        if (userInfoOptional.isPresent()) {
            System.out.println(userInfoOptional.get());
        }
    }

    @Test
    public void test3() {
        Optional<UserInfo> userInfoOptional = Optional.empty();
        if (userInfoOptional.isPresent()) {
            System.out.println(userInfoOptional.get());
        }
    }
}

标签:userInfoOptional,isPresent,System,使用,println,Optional,java8,out
来源: https://www.cnblogs.com/lwjQAQ/p/16370758.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有