美文网首页JavaWebJava学习笔记Java 杂谈
Java8新特性-013-Optional 容器类

Java8新特性-013-Optional 容器类

作者: 53b3f4658edc | 来源:发表于2018-01-21 15:17 被阅读3次

概述

Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常。

  • 常用方法:
    1.Optional.of(T t) : 创建一个Optional 实例
    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

测试代码

TestOptional.java

package java8.optional;

import java.util.Optional;

import org.junit.Test;

/** 
* @author 微信公众号:JavaWeb架构师
* @version 创建时间:5 Jan 2018 12:58:39 
*/
public class TestOptional {
    
    /**
     * 
     * Optional概述:
     *  Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,
     *  原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且
     *  可以避免空指针异常。
     * 方法:
     *  1.Optional.of(T t) : 创建一个Optional 实例
     *  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.get():返回对象中包含的值,是空Optional的话,有会异常
     *  8.map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
     *  9.flatMap(Function mapper):与map 类似,要求返回值必须是Optional
     */
    
    // 1.Optional.of(T t):封装非null值
    @Test
    public void test1() {
        // ①.Optional.of(T t):封装一个Optional实例,其中值t不能为null,否则有NullPointException
        Optional<String> optional = Optional.of(new String("冯强"));
        
        // ②.Optinal.get():获取其中封装的值
        String name = optional.get();
        
        System.out.println("姓名:" + name);
        /*
         * 结果:
         * 姓名:冯强
         */
    }
    
    // 2.Optional.empty():封装一个空的Optional实例
    @Test
    public void test2() {
        // ①.Optional.empty():封装一个空的Optional对象(封装null)
        Optional<Object> empty = Optional.empty();
        
        // ②.isPresent():判断其中是否包含值
        System.out.println(empty+ ":" + empty.isPresent());
        
        // 封装的空的Optional,调用其中的get()方法会出现NoSuchElementException  
        empty.get();
        /*
         * 结果:
         * Optional.empty:false
         * java.util.NoSuchElementException: No value present
         */
    }
    
    // 3.Optional.ofNullable(T t):非null就和of方法一样,null就和empty()一样
    @Test
    public void test3() {
        // 封装null成一个空的Optional
        Optional<Object> nullable = Optional.ofNullable(null);
        System.out.println(nullable+ ":" + nullable.isPresent());
        
        // 封装一个非null值成Optional
        Optional<String> nullable2 = Optional.ofNullable(new String ("冯强"));
        System.out.println("姓名:" + nullable2.get());
        /*
         * 结果;
         * Optional.empty:false
         * 姓名:冯强
         */
    }
    
    // 4.获取对象中的值
    @Test
    public void test4() {
        Optional<Object> ofNullable = Optional.ofNullable(null);
        
        // ①.orElse(T t) : 如果包含值,那返回值;否则返回替代值-t
        Object orElse = ofNullable.orElse(new String("冯强"));
        System.out.println("姓名:" + orElse);
        
        // ②.orElseGet(Supplier s) :如果包含值,那返回值;否则返回s 获取的值
        Object orElseGet = ofNullable.orElseGet(() -> new String("冯强"));
        System.out.println("姓名:" + orElseGet);
        
        // ③.get():返回对象中包含的值,是空Optional的话,有会异常
        System.out.println("姓名:" + ofNullable.get());
        /*
         * 结果:
         * 姓名:冯强
         * 姓名:冯强
         * java.util.NoSuchElementException: No value present
         */
    }
    
    // 5.map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
    @Test
    public void test5() {
        Optional<String> ofNullable = Optional.ofNullable(new String("冯强"));
        
        // 把原有值处理成另外一个值(原有值类型及其子类),封装在Optional中返回(会自动的把返回值封装在Optional中)
        Optional<String> map = ofNullable.map((e) -> "帅哥" );
        
        System.out.println(map.orElse("空的"));
        /*
         * 结果:
         * 帅哥
         */
    }
    
    // 6.flatMap(Function mapper):与map 类似,要求返回值必须是Optional
    @Test
    public void test6() {
        Optional<Object> ofNullable = Optional.ofNullable("ssd");
        
        // 必须手动的把返回值封装在Optional中
        Optional<String> flatMap = ofNullable.flatMap((e) -> Optional.ofNullable(new String("冯强")));
        System.out.println(flatMap);
        /*
         * 结果:
         * Optional[冯强]
         */
    }
}
微信公众号:JavaWeb架构师

其它

  • 源码下载
关注下方公众号,回复:Java8.code
完整教程PDF版本下载

相关文章

  • Java8新特性-013-Optional 容器类

    概述 Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原...

  • Java8 日期类相关介绍

    Java8 时间日期类操作 Java8的时间类有两个重要的特性 线程安全 不可变类,返回的都是新的对象显然,该特性...

  • JAVA8新特性-Optional类解决NPE问题

    ** JAVA8新特性-Optional类解决NPE问题** API介绍 1、Optional(T value),...

  • Java发展历史

    Java8新特性:

  • Java8 新特性

    Java8新特性

  • 1.Java8你需要了解的

    一、Java8新增了哪些新特性: 新特性Java8 新增了非常多的特性,我们主要讨论以下几个: 1、接口默认方法:...

  • java(java8新特性)

    java8新特性总结-1java8新特性总结-2体现在语言,类库,编译器,工具,运行时(JVM)五个方面 lamb...

  • Optional源码分析(未完)

    Optional源码分析(未完) Optional 类是Java8的新特性,Optional是一个可以为null的...

  • Optional类

    Optional类为Java8新引入的一个类,Optional是一个可以为null的容器对象,Optional中的...

  • JDK8新特性回顾

    Java8是Java5以来最具革命性的版本。为Java语言、类库、开发工具与JVM带来了大量新特性。以下是新特性的...

网友评论

    本文标题:Java8新特性-013-Optional 容器类

    本文链接:https://www.haomeiwen.com/subject/hczfaxtx.html