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();
        }
    }
}

执行结果

相关文章
|
6月前
|
存储 安全 数据库
【C++ 17 包裹器类 std::optional】“深入理解C++:std::optional的高级应用与原理
【C++ 17 包裹器类 std::optional】“深入理解C++:std::optional的高级应用与原理
379 0
|
3月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
|
5月前
|
Java 编译器
Guava Optional类分析
Guava Optional类分析
Guava Optional类分析
Optional 与传统 If 判断的区别
Optional 与传统 If 判断的区别
59 0
|
容器
Optional容器类
Optional容器类
49 0
|
Java Scala
全面探索Optional类型
全面探索Optional类型
全面探索Optional类型
重构——18自封装字段(Self Encapsulate Field)
自封装字段(Self Encapsulate Field):你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙;为这个字段建立取值/设置函数,并且只以这些函数来访问字段
1854 0
|
Java 开发者
Optional 类|学习笔记
快速学习 Optional 类
149 1
Optional 类|学习笔记
|
Java 测试技术 API
Optional 是个好东西,你真的会用么?
在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示
Optional 是个好东西,你真的会用么?
|
Java 容器
给女朋友讲解什么是Optional【JDK 8特性】
从Lambda表达式,到Optional讲解,了解一下。
1281 0