Optional再扩展

简介: Optional再扩展

他们之所以做得到,就因为他们认为他们能够做到。—— 维吉尔

关于Optional的介绍,之前的博客已经说过了,这里就不再赘述

这里写点常用的例子

package com.ruben;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import java.util.stream.Stream;
/**
 * @ClassName: OptionalDemo
 * @Description: 我还没有写描述
 * @Date: 2021/1/5 0005 20:47
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
public class OptionalDemo {
    public static void main(String[] args) {
        String str = null;
        // 直接使用Optional.map去调用函数,避免空指针,其中的任意一个函数返回为空的话,则直接调用后面的orElse(String::new)并返回new String()执行的结果
        System.out.println(Optional.ofNullable(str).map(""::equals).map(Boolean::getClass).map(Class::getName).orElseGet(String::new));
        // 上面的方法,每次都需要使用.map去操作,比较繁琐,于是这里定义一个叫 avoidNPE 的函数去处理空指针异常
        // 使用方式如下
        System.out.println(avoidNPE(() -> Boolean.valueOf(str.equals("")).equals(Boolean.FALSE)).orElse(false));
        // 再来一个对比,更明显一点
        // 之前
        System.out.println(Optional.ofNullable(Arrays.asList()).map(List::stream).map(Stream::sorted).map(Stream::distinct).flatMap(Stream::findFirst).orElse("empty"));
        // 使用自定义的函数后
        System.out.println(avoidNPE(() -> Arrays.asList().stream().sorted().distinct().findFirst().orElse("empty")).get());
        List<String> list = null;
        // 同理,数组越界也可以自定义一个函数做相同处理
        avoidNPEOrIOB(list, 5).filter(s -> s.length() > 2).map(String::hashCode).ifPresent(System.out::println);
    }
    /**
     * @MethodName: avoidNPEOrIOB
     * @Description: 避免空指针和数组越界
     * @Date: 2021/1/5 0005 21:14
     * *
     * @author: <achao1441470436@gmail.com>
     * @param: [list, index]
     * @returnValue: java.util.Optional<T>
     */
    public static <T> Optional<T> avoidNPEOrIOB(List<T> list, int index) {
        try {
            return Optional.ofNullable(list.get(index));
        } catch (NullPointerException | ArrayIndexOutOfBoundsException e) {
            return Optional.empty();
        }
    }
    /**
     * @MethodName: avoidNPE
     * @Description: 避免空指针
     * @Date: 2021/1/5 0005 21:14
     * *
     * @author: <achao1441470436@gmail.com>
     * @param: [supplier]
     * @returnValue: java.util.Optional<T>
     */
    public static <T> Optional<T> avoidNPE(Supplier<T> supplier) {
        try {
            return Optional.ofNullable(supplier.get());
        } catch (NullPointerException e) {
            return Optional.empty();
        }
    }
}

执行结果

相关文章
|
JavaScript Java 测试技术
基于SpringBoot+Vue的毕业设计管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的毕业设计管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
692 0
|
存储 数据处理 Python
批量读取docx文件中的excel表格格式数据
批量读取docx文件中的excel表格格式数据
306 6
|
关系型数据库 MySQL Java
Java 最常见的面试题:说一下 mysql 的行锁和表锁?
Java 最常见的面试题:说一下 mysql 的行锁和表锁?
|
存储 Java
Java数据结构之第十五章、Trie(前缀树/单词查找树)
1.前缀树的概念:前缀树又叫字典树或单词查找树(高效的存储和查找字符串集合的数据结构)。2.3.存储形式:存储的字符串可能:全是 小写字母 或全是 大写字母 或全是 数字 或全是 0和1。它是一棵,每个代表一个,从。字典树的根节点不包含字符,每个子节点代表一个字符,从根节点到任意一个节点所经过的路径上的字符连接起来即为该节点所代表的字符串。每个节点可以存储一个或多个字符串,通常使用一个标志来标记一个节点代表的字符串是否存在。当需要在一组字符串中查找某个字符串时,可以利用字典树来实现高效的查找操作。
188 0
|
机器学习/深度学习 开发工具 计算机视觉
舌体分割的初步展示应用——依托Streamlit搭建demo
舌体分割的初步展示应用——依托Streamlit搭建demo
386 0
|
Java Linux Apache
CentOS下Maven环境变量配置
Maven是 Apache 下的一个纯 Java 开发的开源项目,是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。本文主要讲解如何在Linux环境下安装和配置Maven变量。
859 0
CentOS下Maven环境变量配置
艾伟:.NET中Flags枚举的使用
  .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天;还有就是用来表示多种复合的状态。这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags] enum Styles{ ShowBorder = 1, //是否显示边框ShowCa...
839 0
|
4天前
|
云安全 监控 安全
|
1天前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?

热门文章

最新文章