# Java8之Optional类 **Repository Path**: fpfgitmy_admin/java8-optional-class ## Basic Information - **Project Name**: Java8之Optional类 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Java8之Optional类 + Optional 类(java.util.Optional)是一个容器类,它可以保存类型T的值,代表这个值存在.后者仅仅保存null,表示这个值不存在。将原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常 #### Optional类的方法 | 返回值 | 方法 | 示意 | 扩展 | | --- | --- | --- | --- | | static Optional | of(T value) | 创建一个Optional实例,t必须非空 | - | | static Optional | empty() | 创建一个空的Optional实例 | - | | static Optional | ofNullable(T value) |创建一个Optional实例,t可以为null | - | | boolean | isPresent() | 判断是否包含对象 | - | | void | ifPresent(Consumer consumer) | 如果有值,就执行Consumer接口的实现代码,别该值会作为参数传给它 | - | | T | get() | 如果Optional容器对象包含值,返回该值,否则抛异常 | - | | T | orElse(T other) | 如果Optional容器对象有值则将其返回,否则返回其指定的other对象 | - | | T | orElseGet(Supplier other) | 如果Optional容器有值则将其返回,否则返回由Supplier接口实现提供的对象 | - | | T | orElseThrow(Supplier exceptionSupplier) throws X | 如果Optional容器有值则返回,否则抛出由Supplier接口实现提供的异常 | - | ##### 代码示例 + 提供的model ``` public class Boy { private Girl girl; public Boy(Girl girl) { this.girl = girl; } public Boy() { } @Override public String toString() { return "Boy{" + "girl=" + girl + '}'; } public Girl getGirl() { return girl; } public void setGirl(Girl girl) { this.girl = girl; } } ``` ``` public class Girl extends Boy{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Girl(String name) { this.name = name; } public Girl() { } @Override public String toString() { return "Girl{" + "name='" + name + '\'' + '}'; } } ``` + 实际操作的代码 ``` @Test public void test1() { Girl girl = new Girl(); Optional og = Optional.of(girl); System.out.println("创建参数不能为空的实例" + og.get()); System.out.println("------------------------------"); girl = null; Optional og1 = Optional.ofNullable(girl); System.out.println("创建参数可以为空的实例" + og1); System.out.println("------------------------------"); } public String getGirlName(Boy boy) { //Java8之前写法 if (boy != null) { if (boy.getGirl() != null) { return boy.getGirl().getName(); } } return null; } public String getGirlNameForJDK8(Boy boy) { // Java8写法 Optional ob = Optional.ofNullable(boy); // 此时的boy1一定非空 Boy boy1 = ob.orElse(new Boy(new Girl("哈哈哈"))); Girl girl = boy1.getGirl(); Optional oj = Optional.ofNullable(girl); // 此时的girl1一定非空 Girl girl1 = oj.orElse(new Girl("滴滴滴")); return girl1.getName(); } @Test public void test2() { // 情况1:实例非null Boy boy = new Boy(); String girlName = getGirlName(boy); System.out.println("Java8之前的写法" + girlName); System.out.println("------------------------------"); // 情况2:实例是null //boy = null; // 情况3:实例有值 boy = new Boy(new Girl("贷款的贷款")); String girlNameForJDK8 = getGirlNameForJDK8(boy); System.out.println("Java8的写法" + girlNameForJDK8); } ```