java8 新特性 - Optional类

深入探讨Java 8新特性:Stream API和Optional类! 本文深入探讨了Java 8引入的Stream API和Optional类两大特性。Stream API通过声明式编程简化集合操作,支持过滤、映射、排序等常见操作,并提供了高效的并行流处理。Optional类则有效避免了NullPointerException,通过安全容器机制优雅处理空值。文章详细讲解了它们的创建方式、常用方法及适用场景,为开发者提供了优化代码、提升效率的实用指南。这两项特性已成为现代Java开发的必备技能,能显著提高代码质量和可维护性。 阅读详情

  Optional类

    到目前为止,臭名昭著的空指针异常时导致java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检测空指针的方式来防止代码污染,他鼓励程序员写更干净的代码。收到Google Guava的启发,Optional类已经成为java 8 类库的一部分。

 

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

 

    Optional类的javadoc描述如下:这是一个可以null的容器对象。如果值存在则isPresent()方法返回true,调用get()方法会返回对象。

 

Optional 提供很多有用的方法:

    创建Optional类对象的方法

      Optional.of(T t) :创建一个Optional 实例,t必须是非空
      Optional.empty() :创建一个空的Optional 实例
      Optional.ofNullable(T t) : t可以为null

   判断Optional容器中是否包含对象

      Boolean isPresent(): 判读是否包含对象

      void ifPresent(Consumer<? super T> consumer) :如果有值,就执行Consumer接口的实现代码,并且改值会作为参数传给它。

  获取Optional容器的对象:

     T get():如果调用对象包含值,返回该值,否则抛异常

     T orElse(T other) : 如果有值则将其返回,否则返回指定的other对象。

     T orElseGet(Supplier<? extends T> other) : 如果有值则将其返回,否则返回由Supplier接口实现提供的对象。

     T orElseThrow(Supplier<? extends X> exceptionSupplier): 如果有值则将其返回,否则抛出有Supplier接口实现提供的异常

 

代码练习

 

package com.sgl.optional;

import org.junit.Test;
import org.springframework.util.StringUtils;

import java.util.Optional;

/**
 *
 * Optional 类: 为了在程序中避免出现空指针异常而创建的。
 *
 * 常用的方法: ofNullable(T t)
 *              orElse(T t)
 *
 * @author not_simple
 * @version 1.0
 * @date 2020/6/6 15:35
 */
public class OptionalTest {
    /*
    Optional.of(T t) :创建一个Optional 实例,t必须是非空
    Optional.empty() :创建一个空的Optional 实例
    Optional.ofNullable(T t) : t可以为null
     */
    @Test
    public void test1(){
        Girl girl = new Girl();
//        girl = null;
        Optional<Girl> optionalGirl = Optional.of(girl);
    }

    @Test
    public void test2(){
        Girl girl = new Girl();
        girl = null;
//        Optional.ofNullable(T t) : t可以为null
        Optional<Girl> optionalGirl = Optional.ofNullable(girl);
        System.out.println(optionalGirl); // Optional.empty
        Girl girl1 = optionalGirl.orElse(new Girl("123"));
        System.out.println(girl1);
    }


    public String getGirlName(Boy boy){
        return boy.getGirl().getName();
    }

    @Test
    public void test3(){
        Boy boy = new Boy();
        String girlName = getGirlName(boy);
        System.out.println(girlName);
    }
    //优化以后的getGirlName() 没有 Optional
    public String getGirlName1(Boy boy){
        if (!StringUtils.isEmpty(boy)){
            Girl girl = boy.getGirl();
            if (!StringUtils.isEmpty(girl)){
                return girl.getName();
            }
        }
        return null;
    }

    @Test
    public void test4(){
        Boy boy = new Boy();
        String girlName = getGirlName1(boy);
        System.out.println(girlName);
    }


    //使用Optional优化以后的getGirlName()
    public String getGirlName2(Boy boy){
        Optional<Boy> boyOptional = Optional.ofNullable(boy);
        //此时boy1 一定非空
        Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪迪")));
        
        Girl girl = boy1.getGirl();

        Optional<Girl> girlOptional = Optional.ofNullable(girl);
        //此时girl1一定非空
        Girl girl1 = girlOptional.orElse(new Girl("小红"));

        return girl1.getName();
    }

    @Test
    public void test5(){
//        Boy boy = new Boy();  // 小红
        Boy boy = null; // 迪迪
        String girlName = getGirlName2(boy);
        System.out.println(girlName);
    }
}

 

 

 

 

【Java 新特性系列】Java 8 Optional 类完全指南 Java 8 引入的Optional类,是一个可以包含或不包含非空值的容器对象。它的目的是为了提供一种更优雅的方式来处理可能为null的值,从而避免直接使用null值可能引发的。使用Optional类可以显著改善代码的可读性和健壮性。防止:使用Optional可以明确地要求用户在使用变量之前处理null情况;增强代码可读性:通过使用Optional的方法,代码的可读性和意图更加明确;Optional类型在 Java 8 的流(Stream)操作中被广泛使用,提供了更复杂的条件查询和变换功能。 阅读详情

相关推荐

论文阅读:SuperGaussians: Enhancing Gaussian Splatting Using Primitives with Spatially Varying Colors

Gaussian Splattings 在基于高斯显式表示的多视图重建中展示出了令人印象深刻的结果。然而,当前的高斯基元只有单视图依赖的颜色和不透明度来表示场景的外观和几何形状,导致了一种非紧凑的表示。在本文中,我们引入了一种名为“超高斯(SuperGaussians)”的新方法,它在单个高斯基元中利用空间变化的颜色和不透明度来提高其表示能力。我们实现了双线性插值、移动核,甚至是小型神经网络作为空间变化函数。

m0_48319749的博客 1508

Java中Optional类使用

1. 简述 在Java8中引入了一个新的类,java.util.Optional<T>,如果一个接口返回Optional,可以表示一个人可能有车也可能没有车,这个比简单的返回Car要更明确。 2. of()方法使用 你可以使用 of() 和 ofNullable() 方法创建包含值的 Optional。两个方法的不同之处在于如果你把 null 值作为参数传递进去,of() 方法会抛出 NullPointerException: Optional<User> opt =

Deronn的博客 1121

GCdepth散点图绘制

基因组组装完成后,需要对组装结果进行评估,其中GC_depth图是一个比较重要的指标,改图的横坐标是GC含量,纵坐标是平均深度。以30k为窗口(window)无overlap计算其GC含量和平均深度。如果存在样品污染,通常能够从GC含量分析中呈现出来。下文探索了几种绘制GC_depth散点图的方法思路。

huangliangbo的专栏 8993

Optional类的get()方法和orElse(默认值)方法(前者可以输出异常;后者可以输出默认值)

Optional类的get()方法和orElse()方法(前者可以输出异常;后者可以输出默认值)

qq_43118674的博客 1086

第十篇|网络子系统 ②——无损以太网、PFC/ECN、DCQCN 与拥塞可视化

网络部分了解了解

qq_37535542的博客 1873

GEE去云处理代码段解读(位运算)

GEE去云处理代码段解读,包含位运算符号解读、bitwiseAnd()函数、eq()函数解读

jiekeheiguanglan的博客 2066

【后端】Optional.get()‘without ‘isPresent() IDEA报黄系列01

Optional.get()'without 'isPresent() , Optional.get()报黄 , Optional.get() , Optional.isPresent() , Optional类是什么 , Optional.get()代码举例 , Optional.get()报错 , NoSuchElementExcpetion

HolaOrange的博客 1万+

s8654

The official Snapdragon Ride SX 4.0 development board provides standardized hardware support for the secondary development and functional verification of the s8654 platform.

qq_39257814的博客 6824

Java8新特性之——Optional类

Optional类是Java 8中引入的一个用于处理null值的容器类。它封装了某个类型的值,这个值可以是null,也可以是非null,通过它可以更优雅和简洁地处理包含null值的对象。Optional类的官方描述:翻译过来就是:一个可能包含null值的容器对象。如果值存在,isPresent()方法将会返回true,get()方法将会返回该值。

dongdong199033的博客 2754

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现(完结,附带项目源码)

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4650

基于STM32LXXX的模数转换芯片ADC(TLA2528IRTER)驱动C程序设计

define TLA2528_ADDR 0x12 << 1 // 用于HAL传输的8位地址(写入为0x24,读取为0x25)// 100kHz (示例值,需根据实际时钟计算)#define TLA2528_REG_PIN_CFG 0x00 // 引脚配置寄存器。#define TLA2528_REG_CHN_SEL 0x01 // 通道选择寄存器。

myron6688的博客 228

java8的Optional的用法

平时开发的工作中, 自己组内的很多大佬经常使用Optional的用法, 自己问他们, 这个到底有什么好处呢,他们说可以很好的规避好空指针的问题, 我们在平时写java代码的时候, 如果是...

故事凌 1049

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2728

java8 新特性之流式数据处理_Java8 新特性之 Optional 类

图片.png摘要: Optional不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现Java8新特性系列NullPointException可以说是所有java[程序员]都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java语言中变得更加简单、易用,而不能完全的将其剔除,所以才有了我们日...

weixin_31052141的博客 210

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java新特性玩转JDK8之Optional类

zssz1026的专栏 108

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java8新特性:Optional类(超详解)

本博主将用优快云记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!分享ChatGPT的相关资料文档、最新资讯、玩法和创意,获取第一手信息,一起走在AI时代的最前线!前100名加入可赠送ChatGPT账号!Optional 类(java.util.Optional)是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。

weixin_52533007的博客 2410

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java 8新特性之收集器,Optional类

一.收集器接口 Collectors类的静态工厂方法能够创建的所有收集器总结: 所有这些收集器都是对Collector接口的实现,以下时Collector接口声明的五个方法: 二.Optional类 是一个容器类,代表一个值存在或不存在,这样就避免了和null检查相关的bug。当变量存在时,Optional类只是对类简单封装,变量不存在时,缺失的值会被建模成一个“空”的Optional...

lx_Frolf的博客 447

Java新特性 JDK8之Optional类

Java新特性 JDK8之Optional类 jdk8新增的Optional类 Optional 类有啥⽤ 主要解决的问题是空指针异常(NullPointerException) 怎么解决? 本质是⼀个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空 创建Optional类 of() null 值作为参数传递进去,则会抛异常 Optional<St...

mingzii的博客 257

【Java8新特性】不了解Optional类,简历上别说你懂Java8!!

写在前面 最近,很多读者出去面试都在Java8上栽了跟头,事后自己分析,确实对Java8的新特性一知半解。然而,却在简历显眼的技能部分写着:熟练掌握Java8的各种新特性,能够迅速使用Java8开发高并发应用!这不,又一名读者因为写了熟练掌握Java8的新特性而被面试官虐的体无完肤!我不是说不能写,可以这样写!但是,咱在写熟练掌握Java8新特性的时候,应该静下心来好好想想自己是否真的掌握了Java8。如果自己心中对是否掌握了Java8这个问题模棱两可的话,那确实要好好静下心来为自己充电了!一定要从模棱两

冰河的专栏 9218

Java8新特性之Optional类

一 概述 Java8中引入了很多新特性,其中Optional类就是一个很重要的特性,它主要功能是解决NPE(NullPointerException)问题。其实Optional是一个包含有可选值的包装类,即Optional类既可以含有对象值也可以为NULL,这样可以减少我们在实际编码中对空值的判断。此外,Optional类也是Java8函数式编程的一大体现。 二 Optional类的实例之Empty() 如代码测试结果所示,这样会抛出SuchElementException的异常。 三 Opi.

calm_encode的博客 1093

java optional 报错,Java8 新特性 Optional 类

Optional 类的简介??Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了。Optional类主要就是为子决解价值亿万的错误,空指针异常。??Optional类其实就是一个可选值的包装类,说明这个类即可以有空值,也可以有对象。Optional 简单使用??这个类也会报空指针异常:of(),empty()@Testpublic void OptionalTest...

weixin_31197675的博客 182

java8新特性之Optional类

该方法的注释大致意思是:Optional是一个容器对象,它可能包含空值,也可能包含非空值。当属性value被设置时,isPesent()方法将返回true,并且get()方法将返回这个值。该类支持泛型,即其属性value可以是任何对象的实例。

a1783760364的博客 690

Java8新特性 Optional类

作为开发人员每天与NullPointerException斗智斗勇。每接收到参数或调用方法获得值得判断一下是否为null。稍不留意,空指针异常就像幽灵一样出现了。这篇文章我们来学习Java8是如何通过Optional类来避免空指针异常的。 先来看一下不使用Optional类时,我们为了防止NullPointerException会怎么处理。 public String getParentName(Person son) { if (son != null) { Person pare

cristianoxm的博客 879

Java8新特性:Optional 类

设计初衷不同:Java 的Optional主要用于减少空指针异常,提高代码的安全性和可读性。相比之下,Scala 的Option和 Kotlin 的Nullable类型设计初衷更加广泛。API 风格:Java 的Optional提供了一系列 API 方法,方便进行链式调用和流处理。这些方法与 Java 8 引入的流操作紧密结合。性能考虑:在高并发环境下,Optional的设计考虑了性能优化,但需要开发者自己注意避免频繁创建对象。Optional。

qq_33326733的博客 1145

Java8新特性——Optional 类

文章目录一、Optional 类概述API介绍ofofNullableemptyisPresentgetifPresentorElseorElseGetorElseThrowmapflatMapfilterOptional应用 一、Optional 类 概述  Optional不是函数式接口,而是用于防止 NullPointerException 的漂亮工具。这是下一节的一个重要概念,让我们快速了解一下Optional的工作原理。  Optional 是一个简单的容器,其值可能是null或者不是null。

weixin_51833408的博客 1191
上一篇: java8 新特性 - Stream API
下一篇: RabbitMQ 5种队列
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值