首页 > 编程语言 >Java8新特性之Optional容器(七)

Java8新特性之Optional容器(七)

时间:2023-10-13 10:12:09浏览次数:49  
标签:容器 optional1 optional2 optional println null Optional Java8

1. Optional介绍

Optional是Java8提供的一个容器对象,可以包含一个为null或者不为null的对象;使用该对象可以更方便的避免项目中的NPE,在新版的Spring Data JPA中已经实现了对该类的支持;

注意该类是被final修饰的,同时没有实现任何接口;

public final class Optional<T> {
    
    private static final Optional<?> EMPTY = new Optional<>();
    
    private final T value;
	
    // ......
}

2. Optional的创建方式

Optional类中有两个私有的构造方法Optional()Optional(T value),同时提供了empty()of(T value)ofNullable(T value)三个公有的静态方法用于创建Optional对象;

public final class Optional<T> {
    
    private static final Optional<?> EMPTY = new Optional<>();
    
    private final T value;
    
    /**
     * 私有的无参构造方法
     */
    private Optional() {
        this.value = null;
    }
    
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    /**
     * 私有的有参构造方法
     */
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
}

三个公共的创建Optional对象静态方法介绍:

  • empty():创建一个包含null对象的Optional对象;

  • of(T value):创建一个包含value对象的Optional对象,若value为null则抛出NullPointerException;

  • ofNullable(T value):创建一个包含value对象的Optional对象,若value为null则返回包含null对象的Optional对象;

public class OptionalTest {

    public static void main(String[] args) {
        Optional<Object> optional1 = Optional.empty();
        System.out.println("optional1: " + optional1);
        try {
            Optional<String> optional2 = Optional.of(null);
        } catch (Exception e) {
            System.out.println("optional2: " + e);
        }
        Optional<String> optional3 = Optional.of("hello optional");
        System.out.println("optional3: " + optional3);
        Optional<String> optional4 = Optional.ofNullable(null);
        System.out.println("optional4: " + optional4);
        Optional<String> optional5 = Optional.ofNullable("hello optional");
        System.out.println("optional5: " + optional5);
    }
}

// 运行结果
optional1: Optional.empty
optional2: java.lang.NullPointerException
optional3: Optional[hello optional]
optional4: Optional.empty
optional5: Optional[hello optional]

3. Optional的API介绍

  • get():获取Optional对象中的值,若值为null则抛出NoSuchElementException异常;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        System.out.println("optional1: " + optional1.get());
        
        Optional<String> optional2 = Optional.ofNullable(null);
        System.out.println("optional2: " + optional2.get());
    }
}

// 运行结果
optional1: hello optional
Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at cn.jackiegu.java8.study.optional.OptionalTest.main(OptionalTest.java:17)

  • isPresent():判断Optional对象中的值是否不为null;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        System.out.println("optional1: " + optional1.isPresent());
        
        Optional<String> optional2 = Optional.ofNullable(null);
        System.out.println("optional2: " + optional2.isPresent());
    }
}

// 运行结果
optional1: true
optional2: false

  • ifPresent(Consumer<? super T> consumer):如果Optional对象中的值不为null,则将该值作为消费者接口的参数进行消费;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        optional1.ifPresent(System.out::println);
        
        Optional<String> optional2 = Optional.ofNullable(null);
        optional2.ifPresent(System.out::println);
    }
}

// 运行结果
hello optional

  • filter(Predicate<? super T> predicate):如果Optional对象中的值不为null,则将该值作为断言接口的参数进行断言,断言成功时返回当前Optional对象,否则返回一个包含null值得Optional对象;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");

        Optional<String> optional2 = optional1.filter(item -> item.contains("hello"));
        System.out.println("optional1.equals(optional2): " + optional1.equals(optional2));
        System.out.println("optional2: " + optional2);

        Optional<String> optional3 = optional1.filter(item -> item.contains("hi"));
        System.out.println("optional1.equals(optional3): " + optional1.equals(optional3));
        System.out.println("optional3: " + optional3);
    }
}

// 运行结果
optional1.equals(optional2): true
optional2: Optional[hello optional]
optional1.equals(optional3): false
optional3: Optional.empty

  • map(Function<? super T, ? extends U> mapper):如果Optional对象中的值不为null,则将该值作为映射接口的参数进行映射,返回一个新的Optional对象;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        Optional<String[]> optional2 = optional1.map(item -> item.split(""));
        System.out.println("optional2: " + Arrays.toString(optional2.get()));
    }
}

// 运行结果
optional2: [h, e, l, l, o,  , o, p, t, i, o, n, a, l]

  • flatMap(Function<? super T, Optional> mapper):该方法与map方法基本一致;

  • orElse(T other):如果Optional对象中的值不为null,则返回该值,否则返回other;

public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        System.out.println("optional1: " + optional1.orElse("hi optional"));
        
        Optional<String> optional2 = Optional.ofNullable(null);
        System.out.println("optional2: " + optional2.orElse("hi optional"));
    }
}

// 运行结果
optional1: hello optional
optional2: hi optional

  • orElseGet(Supplier<? extends T> other):如果Optional对象中的值不为null,则返回该值,否则返回生产者接口返回的值;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        System.out.println("optional1: " + optional1.orElseGet(() -> {
            System.out.println("optional1 supplier running");
            return "hi optional";
        }));
        
        Optional<String> optional2 = Optional.ofNullable(null);
        System.out.println("optional2: " + optional2.orElseGet(() -> {
            System.out.println("optional2 supplier running");
            return "hi optional";
        }));
    }
}

// 运行结果
optional1: hello optional
optional2 supplier running
optional2: hi optional

  • orElseThrow(Supplier<? extends X> exceptionSupplier):如果Optional对象中的值不为null,则返回该值,否则抛出异常生产者返回的异常;
public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional1 = Optional.ofNullable("hello optional");
        System.out.println("optional1: " + optional1.orElseThrow(() -> new RuntimeException("optional1 runtimeException")));

        Optional<String> optional2 = Optional.ofNullable(null);
        System.out.println("optional2: " + optional2.orElseThrow(() -> new RuntimeException("optional2 runtimeException")));
    }
}

// 运行结果
optional1: hello optional
Exception in thread "main" java.lang.RuntimeException: optional2 runtimeException
	at cn.jackiegu.java8.study.optional.OptionalTest.lambda$main$1(OptionalTest.java:18)
	at java.util.Optional.orElseThrow(Optional.java:290)
	at cn.jackiegu.java8.study.optional.OptionalTest.main(OptionalTest.java:18)

原文链接:https://blog.csdn.net/gu19930914/article/details/115868259

标签:容器,optional1,optional2,optional,println,null,Optional,Java8
From: https://www.cnblogs.com/hefeng2014/p/17761279.html

相关文章

  • Java8新特性之Stream流(六)
    1.Stream流介绍一种支持顺序和并行聚合操作的元素序列,能够对集合、数组进行过滤、排序、去重等操作;Stream流与日常IO流是不同的技术体系;官方定义:Asequenceofelementssupportingsequentialandparallelaggregateoperations.Stream的两种操作:publicclassStreamTes......
  • Java8新特性之重复注解和类型注解(五)
    1.重复注解介绍Java8中引入的一个新注解@Repeatable,该注解只能标记在其他注解上,表示被标记的注解可以重复声明在类、属性、方法等上面;但@Repeatable注解还是得需要定义容器注解配合才能使用,所以也只是增强了代码的可读性;publicclassAnnotationTest{/***Java8之......
  • Java8新特性之方法引用(三)
    1.方法引用介绍方法引用其实是lambda表达式的升级写法,采用::固定语法,可以使代码更简洁、紧凑;2.方法引用的5种类型2.1对象引用::实例方法名函数式接口抽象方法的形参列表与实例方法的一致,且方法的返回值类型一致;publicclassMethodReferencesTest{publicstaticvo......
  • Java8新特性之接口的默认方法和静态方法(四)
    1.背景介绍在Java8之前,接口中定义的方法都是抽象方法,即默认都是被publicabstract修饰的;但从Java8开始,允许在接口中定义带有方法体的默认方法和静态方法;publicclassInterfaceTest{publicstaticvoidmain(String[]args){}}interfaceInterfaceA{/*......
  • Java8新特性之函数式接口(二)
    1,函数式接口介绍前言:由于Java8中引入了lambda表达式语法,但该语法需要配合一种特定的接口才能使用,由此产生出了函数式接口;函数式接口指有且仅有一个抽象方法(由Object对象继承的方法不算)(但可以有多个默认方法和静态方法)的接口,当这样的接口在作为方法参数时可以隐式的转换为lambda......
  • Java8新特性之Lambda表达式(一)
    Java8新特性之Lambda表达式(一)文章目录1.lambda表达式介绍2.lambda表达式的重要特征3.lambda表达式对域外变量的限制4.lambda表达式的优缺点5.lambda表达式的使用场景6.lambda表达式的实现原理7.相关链接1.lambda表达式介绍lambda表达式是Java8提供的新特......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之堆叠容器
    ​【关键字】HarmonyOS、低代码平台、组件拖拽、堆叠组件 1、写在前面从本篇开始,我们一起来学习一下低代码平台中组件的托拉拽,虽然组件拖拽十分简单,但实际上还是有一定的技巧,新手上路难免会遇到一定的问题,如果能熟练掌握拖拽的技巧,能够有效地提升咱们的开发效率哦,今天我们先......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之滚动容器
    ​【关键字】HarmonyOS、低代码平台、组件拖拽、滚动容器 1、写在前面上一篇中我们介绍了低代码平台组件库中的堆叠容器的一些拖拽技巧,本篇我们继续,今天带大家一些来看一个新的组件——滚动容器。关于滚动容器的直接使用其实很简单,所以这个不是今天的重点,今天的重点是如何在......
  • 4大换新,华为云CCE带你感受容器化上云体验
    本文分享自华为云社区《华为云CCE邀您共同打造最佳容器化上云体验》,作者:云容器大未来。在容器化日益成为中大型企业上云主流选择的情况下,容器服务如何能帮助用户更简单快捷的上云、高效可信赖的运维?为了更好的解决这个问题,CCE用户体验团队在今年进行了大量的用户现场调研,聆听用......
  • Cloud Bursting解决方案,Serverless容器降本增效极致体验
    本文分享自华为云社区《DTSETechTalk|第42期:CloudBursting解决方案,Serverless容器降本增效极致体验》,作者:华为云社区精选。线下IDC自建K8s集群容量无法满足业务峰值诉求?IDC基础设施扩容流程慢,一次性投入大,管理维护成本高?在《云原生Bursting,如何助力企业降本增效》的主题直播......