嘘~ 正在从服务器偷取页面 . . .

Java8 Optional API


Java8 中的 Optional

关于Optional

该类位于java.util下,属于final类,其实就是一个工具类。
主要是为了预防运行时抛出 NullPointException

使用示例:

package com.xiaocai.cn.optional;

import java.util.Optional;

public class OptionalTest {

    public static void main(String[] args) {
         Optional<String> optionalS = Optional.of(new String("zhangxiaocai"));
         System.out.println(optionalS.get());
         //输出: zhangxiaocai
    }

}

Optional主要方法API

方法API说明
of(T value)把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
ofNullable(T value)把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
get()如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
isPresent()如果创建的Optional中的值存在,返回true,否则返回false
ifPresent(Consumerc)如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做
orElse(T value)如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
orElseGet(Supplier s)如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
orElseThrow(Supplier s)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
empty()创建一个空的Optional对象
orElseThrow如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
filter(Predicate p)如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map(Function f)如果创建的Optional中的值存在,对该值执行提供的Function函数调用
flagMap(Function f)如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象

普通思维实例演示

package com.xiaocai.cn.optional;

import java.util.Optional;
import static java.lang.System.out;

public class OptionalTest {

    public static void main(String[] args) {
         Optional<String> optionalS = Optional.of(new String("zhangxiaocai"));
         out.println(optionalS.get());


         UserModel user = null;
         //Optional<UserModel> userOption1 = Optional.of(user);//会抛异常
         //out.println(userOption1.get());
         Optional<UserModel> userOption2 = Optional.ofNullable(user);//不会抛异常
         out.println(userOption2.get()); //调用的时候会抛异常,因此调用需要先判断


         user = new UserModel();
         user.setId(1);
         user.setName("xiaocai");
         user.setEmail("small-rose@qq.com");

         //即使使用了之前的变量名,依旧是一个新的对象
         userOption2 = Optional.of(user);
         out.println(userOption2.get());

         if(userOption2.isPresent()){
             out.println(userOption2.get()); 
             Optional<Integer> uid = Optional.ofNullable(userOption2.get().getId());
             if(uid.isPresent()){
                 out.println("user  id is "+uid.get());
             }
             Optional<String> email = Optional.ofNullable(userOption2.get().getEmail());
             if(email.isPresent()){
                 out.println("you can send mail to "+email.get());
             }

             //Optional.orElse - 如果值存在,返回它,否则返回提供的默认值
             Optional<String> nameopt = Optional.ofNullable(userOption2.get().getEmail());
             String name = nameopt.orElse(new String("zhangxiaocai"));
             out.println("user name is "+name);

         }else{
             out.println("user is null ");
         }
    }

}

函数式编程演示

函数式编程注意方法API中传的参数。
留意带参数的几个API:
ifPresent(Consumer<? super T> consumer
orElseGet(Supplier<? extends T> other)
orElseThrow(Supplier<? extends X> exceptionSupplier)
map(Function<? super T,? extends U> mapper)
flagMap(Function<? super T,Optional<U>> mapper)

package com.xiaocai.cn.optional;

import static java.lang.System.out;

import java.util.Optional;
import java.util.function.Supplier;

public class OptionalFuncTest {

    public static void main(String[] args) {

         UserModel user1 = null ;
         Optional<UserModel> userop1 = Optional.ofNullable(user1);

         //如果user1为null,就实例化一个
         //orElse 与之前相同 写法1
         UserModel defuser1 =userop1.orElse(new UserModel());
         out.println(defuser1);
         //函数式 orElseGet 写法2
         UserModel defuser2 = userop1.orElseGet(()-> new UserModel());
         //if(userop1.isPresent()){ defuser2 = userop1.get(); }else{ defuser2 = new UserModel(); }

         out.println(defuser2);

         UserModel user = new UserModel();
         user.setId(1);
         user.setName("xiaocai");
         user.setEmail("small-rose@qq.com");


         Optional<UserModel> userop2 = Optional.ofNullable(user);
         //如果 userop 里的对象不为空,则取出名称并打印
         //函数式ifPresent 是无返回值的 Consumer消费型接口
         userop2.ifPresent(u ->  out.println(u.getName()));
         // if(userop2.isPresent()){ out.println(userop2.get().getName()); }

         //user1如果是空的,就实例化一个,但是名称也是空的,为了测试orElseGet
         Optional<String> nameop = Optional.ofNullable(userop1.orElseGet(()-> new UserModel()).getName());

         //函数式orElseGet 是有返回值的 Supplier供给型接口
         String userName = nameop.orElseGet(() -> new String("zhangxiaocai"));
         // if(nameop.isPresent()){ userName = nameop.get(); }else{ userName = "zhangxiaocai"; }

         out.println("user name is " +userName);

         //如果要求不允许随便实例化怎么办呢?那就可以判断,是否为空,若为空抛出异常即可
         userop1.orElseThrow(IllegalArgumentException::new);

        // userop2.map(  uOptionalFuncTest::sendEmail (u));

    }

    public static void sendEmail(UserModel u){

        out.println(" send email to " + u.getEmail());
    }
}


版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录