zoukankan      html  css  js  c++  java
  • Java8之Optional用法举例

    一、简介

    Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
    Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
    Optional 类的引入很好的解决空指针异常。

    二、代码举例

    import bean.User;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test;
    import java.util.*;
    
    @Slf4j
    public class OptionalDemo {
    
        public List<User> getList() {
            List<User> users = new ArrayList<>();
            User user = new User("Tom", 22, "Street #1");
            users.add(user);
            users.add(new User("Michael", 33, "Street #2"));
            users.add(new User("Lily", 25, "Street #3"));
            return users;
        }
    
        @Test
        public void testOptional() {
            List<User> users = getList();
            User user = users.get(0);
    
            /*判断是否为空*/
            Optional<User> optional = Optional.of(user);
            log.info("optional.isPresent(): " + optional.isPresent());
    
            /*不确定是否为null*/
            User user2 = null;
            Optional<User> optional2 = Optional.ofNullable(user2);
            log.info("optional2.isPresent(): " + optional2.isPresent());
    
            /*数据为null时给默认值*/
            log.info("optional3.orElse(): " + Optional.ofNullable(user2).orElse(user));
    //        通过函数获取默认值,不为空时不执行
    //        log.info("optional3.orElseGet(): " + Optional.ofNullable(user).orElseGet(createUser()));
    //        为null时,抛出指定的异常
    //        log.info("optional3.orElseGet(): " + Optional.ofNullable(user2).orElseThrow(() -> new IllegalArgumentException("数值不能为空!")));
    
    //        对单个值进行处理
            users.stream().map(x -> x.getName()).forEach(x -> System.out.println("map:" + x));
    //        拆分为多个值分别处理
            users.stream().flatMap(x -> Arrays.stream(x.getName().split("o"))).forEach(x -> System.out.println("flatMap:" + x));
        }
    
        @Test
        public void testComparator() {
            List<User> users = getList();
    
            /*查询年龄最大的人*/
            Optional<User> max = users.stream().max(Comparator.comparing(User::getAge));
            log.info("maxAge: " + max.get().toString());
    
            /*名字最长的人*/
            Optional<String> max2 = users.stream().map(u -> u.getName()).max(Comparator.comparing(String::length));
            log.info("maxStringLength: " + max2.get());
        }
    
    }

    运行结果:

    #testOptional
    19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional.isPresent(): true
    19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional2.isPresent(): false
    19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional3.orElse(): User[name='Tom', age=22, address='Street #1']
    map:Tom
    map:Michael
    map:Lily
    flatMap:T
    flatMap:m
    flatMap:Michael
    flatMap:Lily
    
    #testComparator
    19:50:34.576 [main] INFO java8.optional.OptionalDemo - maxAge: User[name='Michael', age=33, address='Street #2']
    19:50:34.586 [main] INFO java8.optional.OptionalDemo - maxStringLength: Michael
  • 相关阅读:
    关联本地代码的方式 HTTPS和SSH---Gitee码云
    详解elementUI表单的验证规则---vue(基本用法)
    vscode 设置缩进 4
    vue的图片懒加载
    A complete log of this run can be found in问题解决
    简单直观的搞懂Vue3的ref、reactive、toRef、toRefs
    vue-cli3.0 引入外部字体并使用
    迅为与龙芯强强联合匠心之作iTOP-2K1000开发板正式发布
    迅为RK3399开发板外接固态硬盘测试
    迅为i.MX6Q开发板Ubuntu20.04 Can通信
  • 原文地址:https://www.cnblogs.com/gongxr/p/14476510.html
Copyright © 2011-2022 走看看