Optional 類
Optional 類(java.util.Optional) 是一個(gè)容器類放钦,代表一個(gè)值存在或不存在供填, 原來(lái)用 null 表示一個(gè)值不存在蟆技,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念留潦。并且 可以避免空指針異常豹芯。
常用方法:
- Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例
- Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例
- Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例
- isPresent() : 判斷是否包含值
- orElse(T t) : 如果調(diào)用對(duì)象包含值罚拟,返回該值台诗,否則返回t
- orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值,返回該值赐俗,否則返回 s 獲取的值
- map(Function f): 如果有值對(duì)其處理拉队,并返回處理后的Optional,否則返回Optional.empty()
- flatMap(Function mapper):與 map 類似阻逮,要求返回值必須是Optional
重復(fù)注解與類型注解
Java 8對(duì)注解處理提供了兩點(diǎn)改進(jìn):可重復(fù)的注解及可用于類型的注解
image.png
代碼演示
####### Goddess
package com.www.java8.optional;
/**
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時(shí)間: 2022/8/15 17:28 星期一
* <p>
*/
public class Goddess {
private String name;
public Goddess() {
}
public Goddess(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Goddess{" +
"name='" + name + '\'' +
'}';
}
}
####### Man
package com.www.java8.optional;
/**
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時(shí)間: 2022/8/15 17:28 星期一
* <p>
*/
public class Man {
private Goddess goddess;
public Man(Goddess goddess) {
this.goddess = goddess;
}
public Man() {
}
public Goddess getGoddess() {
return goddess;
}
public void setGoddess(Goddess goddess) {
this.goddess = goddess;
}
@Override
public String toString() {
return "Man{" +
"goddess=" + goddess +
'}';
}
}
NewMan
package com.www.java8.optional;
import java.util.Optional;
/**
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時(shí)間: 2022/8/15 17:35 星期一
* <p>
*/
public class NewMan {
private Optional<Goddess> goddess= Optional.empty();
public NewMan(Optional<Goddess> goddess) {
this.goddess = goddess;
}
public NewMan() {
}
public Optional<Goddess> getGoddess() {
return goddess;
}
public void setGoddess(Optional<Goddess> goddess) {
this.goddess = goddess;
}
@Override
public String toString() {
return "NewMan{" +
"goddess=" + goddess +
'}';
}
}
####### OptionalTest
package com.www.java8.optional;
import com.www.java8.entity.Employee;
import org.junit.Test;
import java.util.Optional;
/**
* <p>
*
* @author Www
* <p>
* 郵箱: 483223455@qq.com
* <p>
* 創(chuàng)建時(shí)間: 2022/8/15 17:09 星期一
* <p>
*/
public class OptionalTest {
/**
* Optional<T> 類(java.util.Optional) 是一個(gè)容器類粱快,代表一個(gè)值存在或不存在原來(lái)用 null 表示一個(gè)值不存在,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念叔扼。并且可以避免空指針異常事哭。
* <p>
* <p>
* <p>
* <p>
* <p>
* 常用方法:
* <p>
* <p>
* Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例
* <p>
* Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例
* <p>
* Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例
* <p>
* isPresent() : 判斷是否包含值
* <p>
* orElse(T t) : 如果調(diào)用對(duì)象包含值,返回該值瓜富,否則返回t
* <p>
* orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值鳍咱,返回該值,否則返回 s 獲取的值
* <p>
* map(Function f): 如果有值對(duì)其處理与柑,并返回處理后的Optional谤辜,否則返回 Optional.empty()
* <p>
* flatMap(Function mapper):與 map 類似,要求返回值必須是Optional
*/
@Test
public void test() {
Optional<Employee> employee = Optional.of(new Employee());
// Optional<Employee> employee = Optional.of(null);
Employee employee1 = employee.get();
System.out.println(employee1);
}
/**
* 創(chuàng)建一個(gè)空的 Optional
*/
@Test
public void test1() {
Optional<Object> empty = Optional.empty();
System.out.println("empty.get() = " + empty.get());
}
/**
*
*/
@Test
public void test2() {
Optional<Employee> employee = Optional.ofNullable(null);
if (employee.isPresent()) {
System.out.println("employee.get() = " + employee.get());
}
Employee employee1 = employee.orElse(new Employee("12", 12, 21.3, Employee.Status.FREE));
System.out.println(employee1);
Employee employee2 = employee.orElseGet(() -> new Employee());
System.out.println(employee2);
}
/**
*
*/
@Test
public void test3() {
Optional<Employee> employee = Optional.ofNullable(new Employee("12", 12, 21.3, Employee.Status.FREE));
Optional<String> s = employee.map(Employee::getName);
System.out.println(s.get());
Optional<String> s1 = employee.flatMap(e -> Optional.ofNullable(e.getName()));
System.out.println("s1 = " + s1.get());
}
/**
*
*/
@Test
public void test4() {
// Man man = new Man();
//// // String goddessName = getGoddessName(man);
// System.out.println(goddessName);
Optional<Goddess> gn = Optional.ofNullable(null);
Optional<NewMan> newMan = Optional.ofNullable(new NewMan(gn));
String goddessNewMan = getGoddessNewMan(newMan);
System.out.println("goddessNewMan = " + goddessNewMan);
}
/**
* 獲取 Goddess 的名字
*
* @param man
* @return
*/
private String getGoddessName(Man man) {
return man.getGoddess().getName();
}
private String getGoddessNewMan(Optional<NewMan> newMan) {
return newMan.orElse(new NewMan())
.getGoddess()
.orElse(new Goddess("w"))
.getName();
}
}