JAva 8におけるOptionalの使い方の詳細

7529 ワード

package com.lyzx.concurrent.java8;

import org.junit.Test;

import java.util.Optional;
import java.util.Random;

public class OptionalTest {

    /**
     * Optional.of(T t)    Optional
     *   >>        T value,  t  null    value
     * isPresent()      
     *   >> return value != null
     * get()     T   t
     *   >>  value != null    value,      
     * Optional.empty()     Optional  
     *
     */
    @Test
    public void test1(){
        Optional op1 = Optional.of(new Java8("first"));
        System.out.println(op1.get()+"   "+op1.isPresent());

        Optional op2 = Optional.empty();
        System.out.println(op2.isPresent()+"   "+ op2.get());
    }

    /**
     * Optional.ofNullable(T t)
     *   >> return value == null ? empty() : of(value)
     *
     */
    @Test
    public void test2(){
//        Optional op1 = Optional.ofNullable(new Java8("   "));

        Java8 j = null;
        Optional op1 = Optional.ofNullable(j);
        System.out.println(op1.isPresent()+"   "+op1.isPresent());
        System.out.println(op1.orElse(new Java8("   ")));
    }

    /**
     * orElseGet(fun)   isPresent()==false             T   t
     */
    @Test
    public void test3(){
        Java8 j = null;//new Java8("AA");//null;
        Optional op1 = Optional.ofNullable(j);

        Java8 j2 = op1.orElseGet(()->{
                    String[] arr = {"   ","   ","   "};
                    Random rand = new Random();
                    return new Java8(arr[rand.nextInt(arr.length)]);
                });
        System.out.println(j2);
    }

    @Test
    public void test4(){
        Man man = new Man("   ",new TargetPhone("P20 Pro"));
        String phoneName = TralditionalMethod(man);
        System.out.println(phoneName);

        System.out.println(TralditionalMethod(null));
    }

    /**
     *                    
     *               null
     * @param man
     * @return
     */
    public String TralditionalMethod(Man man){
        if(null != man){
            TargetPhone phone = man.getPhone();
            if(null != phone){
                String phoneName = phone.getPhoneName();
                return phoneName;
            }
        }
        return "  Mix2S";
    }

    @Test
    public void test5(){
//        XMan xman = new XMan("   ",Optional.of(new TargetPhone("  T3")));
//        Optional op = Optional.ofNullable(xman);

        Optional op = Optional.empty();
        System.out.println(newMethod(op));
    }

    /**
     *              ,
     *         ,       null      Optional
     * @param man
     * @return
     */
    public String newMethod(Optional man){
        return man.orElse(new XMan("  ",Optional.of(new TargetPhone("  Mix2S"))))
                .getPhone()
                .get()
                .getPhoneName();
    }
   /**
     *    ifPresent   
* op , */ @Test public void test6(){ String data = null;//"1,2,3"; Optional op = Optional.ofNullable(data); op.ifPresent(x->{ for(String v : x.split(",")){ System.out.println("--"+v); } }); if(op.isPresent()) System.out.println(op.get()); } /** * orElse() orElseGet() op get() , * * orElse() op , * orElseGet() get() * * orElseThrow() op */ @Test public void test7(){ String data = null; // String data = "youzhi"; Optional op = Optional.ofNullable(data); String other = op.orElse(getStr()); System.out.println("1:"+other); System.out.println("==================="); String elseGet = op.orElseGet(()->getStr()); System.out.println("2:"+elseGet); op.orElseThrow(()->new IllegalArgumentException(" ")); } public String getStr(){ System.out.println("getStr() ......"); return "getStrValue"; } /** * map() flatMap() */ @Test public void test8(){ Man man = new Man(" ",new TargetPhone("iphoneX")); // Man man = null; Optional op = Optional.ofNullable(man); String ss = op.map(x -> x.getManName()).orElseGet(() -> " "); System.out.println(ss); TargetPhone t3 = op.map(x -> x.getPhone()).orElseGet(() -> new TargetPhone("T3")); System.out.println(t3.getPhoneName()); } /** * Optional * */ @Test public void test9(){ // Man man = new Man(" ",new TargetPhone("iphoneX")); Man man = null; Optional op = Optional.ofNullable(man); String iphoneName = op.map(x->x.getPhone()) .map(x->x.getPhoneName()) .orElse(" "); System.out.println(iphoneName); } /** * filter */ @Test public void test10(){ Man man = new Man(" ",new TargetPhone("iphoneX")); Optional op = Optional.ofNullable(man); Optional phone = op.map(x -> x.getPhone()) .filter(x -> x.getPhoneName().length() > 5); System.out.println(phone.orElse(new TargetPhone(" ")).getPhoneName()); }

}

class Java8{
    private String name;

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

    @Override
    public String toString() {
        return "Java8{" +
                "name='" + name + '\'' +
                '}';
    }
}

class Man{
    private String manName;
    private TargetPhone phone;

    public Man(String manName,TargetPhone phone){
        this.manName=manName;
        this.phone = phone;
    }

    public String getManName() {
        return manName;
    }

    public TargetPhone getPhone() {
        return phone;
    }

    @Override
    public String toString() {
        return "Man{" +
                "manName='" + manName + '\'' +
                ", phone=" + phone +
                '}';
    }
}

class TargetPhone{
    private String phoneName;

    public TargetPhone(String phoneName){
        this.phoneName = phoneName;
    }

    public String getPhoneName(){
        return phoneName;
    }
}

class XMan{
    private String manName;
    private Optional phone;

    public XMan(String manName,Optional phone){
        this.manName = manName;
        this.phone = phone;
    }

    public String getManName() {
        return manName;
    }

    public Optional getPhone() {
        return phone;
    }

    @Override
    public String toString() {
        return "XMan{" +
                "manName='" + manName + '\'' +
                ", phone=" + phone +
                '}';
    }
}