1. 程式人生 > >Java8新特性——Optional類

Java8新特性——Optional類

        Optional<T>類(java.util.Optional)是一個容器類,代表一個值存在或不存在,原來用null表示一個值不存在,現在Optiolal可以更好地表達這個概念。並且可以避免空指標異常。

        也就是說呼叫一個方法得到了一個返回值卻不能直接將返回值作為引數去呼叫別的方法,我們首先要判斷這個返回值是否為空,只有在非空的情況下才能將其作為其它方法的引數。       

Optional容器類的常用方法:
   1、Optional.of(T t):建立一個Optional例項,需要注意的是,建立物件時傳入的引數不能為null。如果傳入引數為null,則丟擲NullPointerException 。
   2、Optional.empty():建立一個空的Optional例項
   3、Optional.ofNullable(T t):若t不為null,建立Optional例項,否則建立空例項
   4、isPresent():判斷是否包含值
   5、orElse(T t):如果呼叫物件包含值,返回該值,否則返回t
   6、orElseGet(Supplier s):如果呼叫物件包含值,返回該值,否則返回s獲取該值
   7、map(Function f):如果有值對其處理,並返回處理後的Optional,否則返回Optional.empty()
   8、flatMap(Function mapper):與map類似,要求返回值必須是Optional
 @Test
    public void fun1(){
//      呼叫工廠方法建立Optional例項
//        java.util.Optional<Employee> optional = java.util.Optional.of(new Employee());
        java.util.Optional<Employee> of = java.util.Optional.of(null);
//        Employee employee = optional.get();
        Employee employee = of.get();
        System.out.println(employee);
    }
    @Test
    public void fun2(){
        java.util.Optional<Object> empty = java.util.Optional.empty();
        System.out.println(empty.get());
    }
    @Test
    public void fun3(){
//        java.util.Optional<Employee> ofNullable = java.util.Optional.ofNullable(new Employee());
        java.util.Optional<Employee> ofNullable = java.util.Optional.ofNullable(null);
//        如果有值就get一個,沒有值的話就拿預設值
        if (ofNullable.isPresent()){
            System.out.println(ofNullable.get());
        }
        Employee orElse = ofNullable.orElse(new Employee("張三", 18, 888.88, Employee.Status.BUSY));
        System.out.println(orElse);

        Employee orElseGet = ofNullable.orElseGet(() -> new Employee("李四", 18, 666.66, Employee.Status.BUSY));
        System.out.println(orElseGet);
    }
    @Test
    public void fun4(){
        java.util.Optional<Employee> ofNullable = java.util.Optional.ofNullable(new Employee("張三", 18, 888.88, Employee.Status.BUSY));
        java.util.Optional<String> map = ofNullable.map((e) -> e.getName());
        System.out.println(map.get());

        java.util.Optional<String> flatmap = ofNullable.flatMap((e) -> java.util.Optional.of(e.getName()));
        System.out.println(flatmap.get());
    }

案例: 

package optional;

public class Person {
    private Fruits fruits;

    public Person() {
    }

    public Person(Fruits fruits) {
        this.fruits = fruits;
    }

    public Fruits getFruits() {
        return fruits;
    }

    public void setFruits(Fruits fruits) {
        this.fruits = fruits;
    }

    @Override
    public String toString() {
        return "Person{" +
                "fruits=" + fruits +
                '}';
    }
}
package optional;

public class Fruits {
    private String name;

    public Fruits() {
    }

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

    public String getName() {
        return name;
    }

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

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

import java.util.Optional;

public class new_Person {
    private Optional<Fruits> optional = Optional.empty();

    public new_Person() {
    }

    public new_Person(Optional<Fruits> optional) {
        this.optional = optional;
    }

    public Optional<Fruits> getOptional() {
        return optional;
    }

    public void setOptional(Optional<Fruits> optional) {
        this.optional = optional;
    }

    @Override
    public String toString() {
        return "new_Person{" +
                "optional=" + optional +
                '}';
    }
}
package optional;

import org.junit.Test;

import java.util.Optional;

public class Examples{

    @Test
    public void fun1(){
        Person person = new Person();
        String fruitsName = getFruitsName(person);
        System.out.println(fruitsName);
    }
//   需求:獲取人喜歡吃的水果的名字
    public String getFruitsName(Person person){
//        會發生空指標異常
        //        return person.getFruits().getName();

        if (person != null){
            Fruits fruits = person.getFruits();
            if (fruits != null){
                return fruits.getName();
            }
        }
        return "Banana";
    }

//    Optional類去書寫
@Test
public void fun2(){
    Optional<new_Person> op = Optional.ofNullable(null);
    String s = getFruitsName1(op);
    System.out.println(s);
}
    public String getFruitsName1(Optional<new_Person> person){
        return person.orElse(new new_Person())
                      .getOptional()
                      .orElse(new Fruits("Banana"))
                      .getName();
    }
}