欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK1.8之 Optional

程序员文章站 2022-03-03 23:07:37
...

前言:Java开发工作中:调用一个方法返回值可能为空,需要进行Null判断,然后做一些相应的业务或者直接抛出NullPointerException。为了减少这样的null值判断,java官方借鉴google guava 类库的 Optional类,在java8中引入了字节的Optional类

of 方法

  • 为非Null值创建一个Optional
  • of 方法通过工厂方法创建Optional 实例,需要注意传入的参数不能为null.否则抛出NullPointerException异常
	@Test
    public void testOptionalOf () {
        Optional<User> user = Optional.of(new User());
        System.out.println(user);
        // --- NullPointerException
        Optional<User> users = Optional.of(null);
        System.out.println(users);
    }

ofNullable

  • 为指定的值创建一个Optional, 如果指定的值为null, 则返回一个空的Optional。可为空的Optional。
 	@Test
    public void testOptionalOfNullable () {
        Optional o = Optional.ofNullable(null);
        System.out.println(o);
    }

isPresent

  • 如果值存在返回true, 否则返回false
	/**
     * 如果值存在返回true, 否则返回false
     */
    @Test
    public void testOptionalIsPresent () {
        // 存在该值
        Optional<User> username = Optional.ofNullable(new User());
        if(username.isPresent()){
            System.out.println(username.get());
        }
        // 不存在
        Optional<User> user = Optional.ofNullable(null);
        if(user.isPresent()){
            System.out.println(user.get());
        }
    }

get

  • 如果Optional 有值则将其返回, 否则抛出NoSuchElementException
	 /**
     * 如果Optional 有值则将其返回, 否则抛出NoSuchElementException
     */
    @Test
    public void testOptionalGet(){
        Optional objNull = Optional.ofNullable(null);
        try {
            System.out.println(objNull.get());
        }catch (NoSuchElementException e) {
            System.out.println(e.getMessage());
        }
    }

ifPresent

  • 如果Optional实例有值则其调用consumer, 否则不做处理。
  • 要理解ifPresent方法,首先要了解Consumer类。简答地说,Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,但没有返回值。 Java8支持不用接口直接通过lambda表达式传入参数。
	 /**
     * 如果Optional实例有值则为其调用consumer ,否则不做处理。
     */
    public static void main(String[] args){
        Optional objNull1 = Optional.ofNullable(new User());
        objNull1.ifPresent((value)->{
            System.out.println(value);
        });

        Optional objNull2 = Optional.ofNullable(null);
        objNull2.ifPresent((value)->{
            System.out.println(value);
        });
    }

orElse

  • 如果有值将其返回,否则返回指定的其它值。
  • 如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。
	/**
     * 如果有值则将其返回,否则返回指定的其它值。
     * 如果Optional实例有值则将其返回,否则返回orElse方法传入的参数
     */
    @Test
    public void testOptionalOrElse(){
        Optional objNull = Optional.ofNullable(null);
        System.out.println(objNull.orElse(new User()));
    }

orElseGet

  • orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
 	/**
     * orElseGet与orElse方法类似,区别在于得到的默认值。
     * orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。
     */
    @Test
    public void testOptionalOrElseGet(){
        Optional objNull = Optional.ofNullable(null);
        System.out.println(objNull.orElseGet(()->new User()));
    }

orElseThrow

  • 如果有值则将其返回,否则抛出supplier接口创建的异常。
    在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
	/**
     * 如果有值则将其返回,否则抛出supplier接口创建的异常。
     * 在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
     */
    @Test
    public void testOptionalOrElseThrow(){
        Optional objNull = Optional.ofNullable(null);
        try {
            System.out.println(objNull.orElseThrow(ValueAbsentException::new));
        }catch (Throwable ex) {
            System.out.println(ex.getMessage());
        }
    }
    public class ValueAbsentException extends Throwable{
        public ValueAbsentException() {
            super();
        }
        public ValueAbsentException(String msg) {
            super(msg);
        }
        @Override
        public String getMessage() {
            return "No value present in the Optional instance";
        }
    }

map

  • 如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。 map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。
	/**
     * 如果有值,则对其执行调用mapping函数得到返回值。
     * 如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,
     * 否则返回空Optional。
     * map方法用来对Optional实例的值执行一系列操作。
     * 通过一组实现了Function接口的lambda表达式传入操作。
     */
    @Test
    public void testOptionalMap(){
        Optional<String> objNull = Optional.ofNullable("");
        Optional<String> optionalS = objNull.map((value) -> value.toUpperCase());
        System.out.println(optionalS.orElse("1"));
    }

flatMap

  • 如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
	/**
     * 如果有值,则对其执行调用mapping函数得到返回值。
     * 如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,
     * 否则返回空Optional。
     * map方法用来对Optional实例的值执行一系列操作。
     * 通过一组实现了Function接口的lambda表达式传入操作。
     */
    @Test
    public void testOptionalFlatMap(){
        Optional<String> objNull = Optional.ofNullable("");
        Optional<String> optionalS = objNull.flatMap((value)->Optional.of(value.toUpperCase()));
        System.out.println(optionalS.orElse("No value found"));
    }

filter

  • filter个方法通过传入限定条件对Optional实例的值进行过滤。
	 /**
     * filter个方法通过传入限定条件对Optional实例的值进行过滤。
     */
    @Test
    public void testOptionalFilter(){
        Optional<String> objNull = Optional.ofNullable("abcdefghijklmn");
        Optional<String> optionalS = objNull.filter((item) -> item.indexOf("a") < 2);
        System.out.println(optionalS.get());
    }