java8--- Optional使用 - 进阶1 - 经验总结

Posted hahajava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8--- Optional使用 - 进阶1 - 经验总结相关的知识,希望对你有一定的参考价值。

 

  https://yq.aliyun.com/articles/716209?spm=a2c4e.11153940.0.0.6a255562myIiAj

正确使用举例

0、经典使用    
        Employee employee1 = new Employee("employee1");
        Employee employee2 = new Employee("employee1");
        Company company = new Company("company");
        List<Employee> list = Arrays.asList(employee1,employee2);
        company.setEmployees(list);
        // 判断公司里面有没有员工  由返回员工列表 没有返回一个空的集合
        Optional<Company> optional = Optional.ofNullable(company);
        System.out.println(optional.map(com -> com.getEmployees()).orElse(Collections.emptyList()));

1、ifPresent()判断替换if
    //待优化
    String referer = request.getHeader("referer");
    if (StringUtils.isNotEmpty(referer)) {
        request.getSession().setAttribute("referer", referer);
    }
    //java8
    Optional.ofNullable(request.getHeader("referer"))
        .ifPresent(s -> {
            request.getSession().setAttribute("referer", s);
    });

2、用orElse替换 if...else...
     //待优化
    String redirect = (String) session.getAttribute("referer");
    if (redirect == null){
        result.put("referer","/index"); 
    }else {
        result.put("referer",redirect);
    }

    //java8
    Optional<String> redirect = Optional.ofNullable((String) session.getAttribute("referer"));
    result.put("referer",redirect.orElse("/index"));

3、用orElseThrow替换 throw new Exception
    //原写法
    ProblemBLOBs problem = problemService.selectByPrimaryKey(id);
    if (problem == null){
        throw new PageException(PROBLEM_NOT_EXIST);
    }
    model.addAttribute("problem",problem);
    //新写法
    Optional<ProblemBLOBs> problem = Optional.ofNullable(problemService.selectByPrimaryKey(id));
    // 使用抛出异常
    model.addAttribute("problem", problem.orElseThrow(() -> new PageException(PROBLEM_NOT_EXIST)));
4、方法的返回值最好也能用Optional包装,这样调用方也好判断是否为空

 

 

使用要点:

1.尽量避免使用get()方法

    下面是get方法的源码,当值为null的时候,会抛出异常,这和我们使用该类方法的目的冲突,我们的目的就是尽可能消灭异常.

     public T get() {

            if (value == null) {

                throw new NoSuchElementException("No value present");

            }

            return value;

     }

    // 这样和null判断没什么区别  最好别这么用 

    Optional<String> str = Optional.of("Hello world");

            if (str.isPresent()){

                str.get();

            }

 

2.尽量避免使用isPresent()方法

3.不要作为类的实例属性 Optional是容器

4.不要作为方法参数

  

 

1.尽量避免使用get()方法

以上是关于java8--- Optional使用 - 进阶1 - 经验总结的主要内容,如果未能解决你的问题,请参考以下文章

《Java8实战》读书笔记09:用 Optional 处理值为 null 的情况

《Java8实战》读书笔记09:用 Optional 处理值为 null 的情况

Java8新特性Optional类

java8--- Optional的使用

Java8 - optional使用

Java8—Stream流式编程Optional容器的详细介绍两万字