天天看點

JDK8-Optional容器(八)

package cn.wcj.jdk8.lambda.test;


public class Godness {

    private String name;

    public Godness() {
    }

    public Godness(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Godness [name=" + name + "]";
    }

}
           
package cn.wcj.jdk8.lambda.test;

public class Man {

    private Godness god;

    public Man() {
    }

    public Man(Godness god) {
        this.god = god;
    }

    public Godness getGod() {
        return god;
    }

    public void setGod(Godness god) {
        this.god = god;
    }

    @Override
    public String toString() {
        return "Man [god=" + god + "]";
    }

}
           
package cn.wcj.jdk8.lambda.test;

import java.util.Optional;

//注意:Optional 不能被序列化,分布式開發不用
public class NewMan {

    private Optional<Godness> godness = Optional.empty();

    private Godness god;

    public Optional<Godness> getGod(){
        return Optional.of(god);
    }

    public NewMan() {
    }

    public NewMan(Optional<Godness> godness) {
        this.godness = godness;
    }

    public Optional<Godness> getGodness() {
        return godness;
    }

    public void setGodness(Optional<Godness> godness) {
        this.godness = godness;
    }

    @Override
    public String toString() {
        return "NewMan [godness=" + godness + "]";
    }

}
           
package cn.wcj.jdk8.lambda.test;

import static org.junit.Assert.*;

import java.security.cert.PKIXRevocationChecker.Option;
import java.util.Optional;

import org.junit.Test;

import cn.wcj.jdk8.lambda.test.Emp.Status;
/*
 * 一、Optional 容器類:用于盡量避免空指針異常
 *  Optional.of(T t) : 建立一個 Optional 執行個體
 *  Optional.empty() : 建立一個空的 Optional 執行個體
 *  Optional.ofNullable(T t):若 t 不為 null,建立 Optional 執行個體,否則建立空執行個體
 *  isPresent() : 判斷是否包含值
 *  orElse(T t) :  如果調用對象包含值,傳回該值,否則傳回t
 *  orElseGet(Supplier s) :如果調用對象包含值,傳回該值,否則傳回 s 擷取的值
 *  map(Function f): 如果有值對其處理,并傳回處理後的Optional,否則傳回 Optional.empty()
 *  flatMap(Function mapper):與 map 類似,要求傳回值必須是Optional
 */
public class OptionalTest {



    @Test
    public void test1() {
       Optional<Emp> optional = Optional.of( new Emp("3333", "張三", , ,Status.BUSY))  ;
//     Optional<Emp> optional = Optional.of(null)  ;
       Emp emp = optional.get()  ;
       System.out.println(emp)   ;
    }

    @Test
    public void test2(){
//      Optional<Object> optional = Optional.ofNullable(null)  ;
//      System.out.println(optional)  ;
        Optional<Object> optional2 = Optional.empty()  ;
        System.out.println(optional2)  ;
    }

    @Test
    public void test3(){
        //Optional<Emp> optional = Optional.ofNullable( new Emp("3333", "張三", , ,Status.BUSY))  ;
        Optional<Emp> optional = Optional.ofNullable(null)  ;
        if(optional.isPresent())
            System.out.println(optional.get());
        else
            System.out.println(new Emp());
    }

    @Test
    public void test4(){
        Optional<Emp> optional = Optional.ofNullable(new Emp("4444", "李四", , ,Status.FREE))  ;
        Emp emp = optional.orElse(new Emp("3333", "張三", , ,Status.BUSY)) ;
        System.out.println(emp);
    }


    @Test
    public void test5(){
        Optional<Emp> optional = Optional.ofNullable(new Emp("4444", "李四", , ,Status.FREE)) ;
        Emp emp = optional.orElseGet(Emp::new)   ;
        System.out.println(emp);
    }

    @Test
    public void test6(){
        Optional<Emp> optional = Optional.ofNullable(new Emp("4444", "李四", , ,Status.FREE))  ;
        Optional<Emp> map = optional.map((e)->{
            e.setEname("李四四")   ;
            return e ;
        });
        System.out.println(map.isPresent());
    }

    @Test
    public void test7(){
        Optional<Emp> optional = Optional.ofNullable(new Emp("4444", "李四", , ,Status.FREE))  ;
        Optional<Emp> map = optional.flatMap(e->{
               e.setEname("李八蛋") ;
               return Optional.of(e);
        })  ;
        System.out.println(map.get());
    }

    //需求:擷取一個男人心中女神的名字
    public String getGodnessName(Man man){
          if(man!=null)
              if(man.getGod()!=null)
                  return man.getGod().getName()   ;
          return "Teacher-Cang"   ;
    }

    //需求[Optional容器闆]:擷取一個男人心中女神的名字
    public String getGodnessName(Optional<NewMan> man){
          return man.orElse(new NewMan())
                    .getGodness()
                    .orElse(new Godness("Teacher-BoDuo"))
                    .getName()   ;
    }

    @Test
    public void test8(){
        Godness god=new Godness("Teacher-LongZe");
        //Man man=new Man()   ;
        Man man=new Man(god);
        String name = getGodnessName(man);
        System.out.println(name);
    }

    @Test
    public void test9(){
        //String name = getGodnessName(Optional.empty());
        //String name = getGodnessName(Optional.of(new NewMan()));
        Godness godness=new Godness("Teacher-XiaoZeMaLiYa")   ;
        NewMan man=new NewMan(Optional.ofNullable(godness))  ;
        String name = getGodnessName(Optional.of(man));
        System.out.println(name);
    }






}