Java8新特性之-Optional

前言

作为Java程序员应该都会有这样的经历: 调用一个方法得到了返回值,此时却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,否则会抛出NullPointerException异常。

Optional概述

Jdk1.8引入。这是一个可以作为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

实例演示

of方法 : public static Optional of (T value) : 为非Null的值创建一个Optional,如果此时传入Null.则抛出NullPointerException异常。

/* of */
//调用工厂方法创建optional实例
Optional<String> name = Optional.of("ocean");
//如果传入null,则会抛出NullPointerException异常
Optional<String> someNull = Optional.of(null);

ofNullable方法: public static Optional ofNullable(T value): 返回一个Optional指定值的Optional,如果非空,则返回一个空的Optional对象。

/* opNullable */
Optional empty = Optional.ofNullable(null);

isPresent方法: public boolean isPresent(): 如果存在值返回true,否则返回false

/* isPresent */
Optional<String> name = Optional.of("ocean");
if (name.isPresent()){
    System.out.println(name.get());//打印值
}

get方法: public T get() : 如果有值则将其返回,否则抛出NoSuchElementExceptipon异常

/* get */
try{
    System.out.println(empty.get());
}catch(NoSuchElementException e){
    log.error();
}

ifPresent方法:public void ifPresent(consumer

/* ifPresent */
name.ifPresent((value)->System.out.println("The length of the values is :")+value.length());

orElse方法:public T orElseGet(Suppier

/* orElse */
System.out.println(empty.orElse("There is no value present!"));
System.out.println(name.orElse("There is some value!"));

orElseGet方法:public T orElseGet(Supplier

/* orElseGet */
 String strA = " abcd ", strB = null;
 Optional<String> optional = Optional.ofNullable(strA);
 System.out.println(optional.orElseGet(() -> "haha")); //打印结果:abcd

 Optional<String> optional = Optional.ofNullable(strB);
 System.out.println(optional.orElseGet(() -> "haha")); //打印结果:haha

orElseThrows方法:public T orElseThrow(Supplier

/* orElseThrows */
String strA = " abcd ", strB = null;
Optional<String> optional = Optional.ofNullable(strA);
optional.orElseThrow(IllegalAccessError::new);  //如果为null,抛出IllegalAccessError异常

map方法: public Optional map(Function

/* map */
 String name = "abcd";
        Optional<String> optional = Optional.of(name);
        Optional<String> upperName = optional.map((value) -> value.toUpperCase());//转换成大写
        System.out.println(upperName.orElse("No value found!")); //打印结果:ABCD

flatMap方法: public Optional flatMap(Function

/* flatMap */
 String name = "abcd";
 Optional<String> upperName = Optional.of(name).flatMap((value) -> Optional.of(value.toUpperCase()));
 System.out.println(upperName.orElse("No value found!")); //打印结果:ABCD

map和flatMap的区别: map是把结果自动封装成Optional,但是flatMap需要我们自己去进行封装。

filter方法: public Optional filter(Predicate

/* filter */
 List<String> names = Arrays.asList("ocean", "oceanhaha");
        for (String name:names){
            Optional<String> optional = Optional.of(name).filter((value) -> value.length() < 7); //过滤字符长度大于7的name
            System.out.println(optional.orElse("The name is more than 6 characters"));
        }  // 打印结果: ocean     备注: 此时的oceanhaha长度大于7被过滤掉了

猜你喜欢

转载自blog.csdn.net/m0_37779570/article/details/81868454