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

 

posted @ 2021-03-03 19:48  星瑞  阅读(1056)  评论(0编辑  收藏  举报