【Java】Stream流中Optional类的用法

33 篇文章 3 订阅
31 篇文章 3 订阅

一、概述

        Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stream流结合提供一致性的函数式编程。

二、方法

static <T> Optional<T>empty() 返回一个空的Optional对象
booleanequals(Object obj)
Optional<T>filter(Predicate<? super T> predicate) 如果有值,返回符合predicate条件的Optional对象, 否则返回空的Optional对象
<U> Optional<U>flatMap(Function<? super T,Optional<U>> mapper) 如果有值,执行mapper映射函数,返回Optional对象, 如果没有值返回空的Optional对象
Tget() 如果值存在返回, 如果不存在抛出异常NoSuchElementException.
inthashCode()
voidifPresent(Consumer<? super T> consumer) 如果值存在就执行consumer函数,否则什么也不做
booleanisPresent() 判断值是否存在
<U> Optional<U>map(Function<? super T,? extends U> mapper) 如果值存在就执行mapper映射函数,
static <T> Optional<T>of(T value) 把指定的value值封装为Optional对象,如果value为null,产生空指针异常
static <T> Optional<T>ofNullable(T value) 把指定的value值封装为Optional对象,如果value为null返回一个空的Optional对象
TorElse(T other) 如果值存在就返回,如果不存在返回other
TorElseGet(Supplier<? extends T> other) 如果存在就返回值,如果不存在,执行Supplier返回另外一个值
<X extends Throwable> TorElseThrow(Supplier<? extends X> exceptionSupplier) 如果存在就返回该值,如果不存在抛出由exceptionSupplier生成的异常
StringtoString()

三、代码demo

package com.example.es.test;

import java.util.Optional;

/**
 * @author 
 * @Description optional的常用方法
 * @date 2022/02/07 16:53
 */
public class TestOptional {

    public static void main(String[] args) {

        // 1、把一个字符串封装为Optional对象
        Optional<String> ofString = Optional.of("qa");  // 参数不能为null

        // 2、为指定的值创建Optional对象,如果参数为null,返回空的Optional对象
        Optional<String> ofString2 = Optional.ofNullable(null);  // 参数可以为null
        System.out.println("ofString2:" + ofString2);        // Optional.empty

        // 3、直接创建一个空的Optional对象
        Optional<String> ofString3 = Optional.empty();
        System.out.println("ofString3:" + ofString3);  // Optional.empty

        // 4、get()获得Optional对象中的值,如果值不存在会产生异常
//        String text = ofString.get();
//        System.out.println("text:" + text);  // qa
//        String text2 = ofString2.get();
//        System.out.println("text2:" + text2);  // java.util.NoSuchElementException: No value present

        // 5、orElse(),如果Optional对象中有值就返回,没有则返回指定的其他值(相比较上一个是不报空指针异常)
//        String text = ofString.orElse("another");
//        System.out.println("text:" + text);  // qa
//        String text2 = ofString2.orElse("another");
//        System.out.println("text2:" + text2);   // another

        // 6、orElseGet(),如果有值就返回,如果Optional对象中没值则创建一个新的
//        String text = ofString2.orElseGet(() -> "newString");
//        System.out.println("text:" + text);     // newString

        // 7、orElseThrow(),如果值存在就返回,否则抛出异常
//        String text2 = ofString2.orElseThrow(NullPointerException::new);
//        System.out.println("text2:" + text2);   // java.lang.NullPointerException
//        String text = ofString.orElseThrow(NullPointerException::new);
//        System.out.println("text:" + text);     // qa

        // 8、filter(),如果Optional对象有值返回满足指定条件的Optional对象,否则返回空的Optional对象
//        String text = ofString.filter(s -> s.length() > 10).orElse("length is letter than 10");
//        System.out.println("text:" + text);  // length is letter than 10
//        String text2 = ofString.filter(s -> s.length() > 1).orElse("length is letter than 1");
//        System.out.println("text2:" + text2);  // qa

        // 9、map(),如果Optional对象的值存在,执行mapper映射函数
//        String text = ofString.map(x -> x.toUpperCase(Locale.ROOT)).orElse("Failure");
//        System.out.println("text:" + text);  // QA
//        String text2 = ofString2.map(x -> x.toUpperCase(Locale.ROOT)).orElse("Failure");
//        System.out.println("text2:" + text2);  // Failure

        // 10、ifPresent(),如果Optional对象有值就执行Consumer函数
        ofString.ifPresent(s -> System.out.println("处理数据:" + s));  // 处理数据:qa
        ofString2.ifPresent(s -> System.out.println("处理数据:" + s)); // 没有值什么也不做

    }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值