首页 > 其他分享 >Optional【JDK8新特性】

Optional【JDK8新特性】

时间:2024-09-03 14:49:36浏览次数:9  
标签:getName 特性 JDK8 user null Optional public User

描述

Optional类旨在解决空指针异常问题,它是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

避免空指针异常

普通写法

  public String getName(User user) {
    return user != null ? user.getName() : null;
  }

  public void processName(User user) {

    String name = getName(user);
    if(name != null) {
      log.info("hello" + name);
    } else {
      log.info("user not found");
    }

  }

Opational写法

public Optional<String> getName(User user) {
  return Optional.ofNullable(user).map(User::getName);
}

public void processName(User user) {
  getName(user).ifPresent(
    name -> log.info("hello" + name)
  );

  getName(user).orElseThrow(() -> new UserNotFoundException("User not found."));
}

链式调用

根据一个对象的值决定是否继续调用链上的其他方法时,Optional可以让你的代码更加流畅:

public void processUser(User user) {
    Optional.ofNullable(user)
        .filter(u -> u.isActive()) // 只处理活跃用户
        .flatMap(u -> Optional.ofNullable(u.getAddress())) // 获取用户的地址
        .map(Address::getCity) // 获取城市名
        .ifPresent(city -> System.out.println("The user is from " + city)); // 输出城市名
}

在这个例子中,我们首先检查user是否为null,然后检查用户是否活跃,接着获取用户的地址,最后获取城市的名称。如果任何一个步骤的结果是null,整个链式调用就会终止。

合并值

需要合并多个可能为null的值,可以使用Optional的or方法:

public void mergeAddresses(User user) {
    String primaryCity = Optional.ofNullable(user.getPrimaryAddress())
        .map(Address::getCity)
        .orElse("Unknown");

    String secondaryCity = Optional.ofNullable(user.getSecondaryAddress())
        .map(Address::getCity)
        .orElse("Unknown");

    String city = Optional.of(primaryCity)
        .or(() -> Optional.of(secondaryCity))
        .orElse("No City Found");

    System.out.println("City: " + city);
}

尝试获取用户的主要地址和次要地址的城市名。如果主要地址的城市名未知,我们就使用次要地址的城市名。如果两者都未知,就使用默认值"No City Found"。

通过使用Optional,我们可以写出更加安全、易于理解和维护的代码。它帮助我们避免了大量的空值检查,减少了代码中的模板模式,并提高了代码的可读性和可维护性。

标签:getName,特性,JDK8,user,null,Optional,public,User
From: https://www.cnblogs.com/dragon-925/p/18394572

相关文章

  • Http不同协议的特性
    网络记录:名称特点Http/1.0 无状态:协议对于事务处理没有记忆功能明文传输:不安全短连接:每发起一个请求,都要新建一次TCP连接,增加了通信开销「请求-应答」的通信模式:同一个连接中,HTTP完成一个事务(请求与响应),才能处理下一个事务。请求是串行的,每一个新请求的发出都要等待上......
  • 11 Python面向对象编程:三大特性,封装、继承、多态
    本篇是Python系列教程第11篇,更多内容敬请访问我的Python合集1封装封装就是把类的公有属性改成私有属性,并且提供对外访问的方法。示例classMyClass:def__init__(self,value):self.__value=valuedefget_value(self):returnself.__......
  • 如何优雅的使用Optional类?
    在项目中我们是用Optional来判空的。//遍历打印userListfor(UserInfouserInfo:Optional.ofNullable(userList).orElse(newArrayList<>())){//printuserInfo}我们通常的做法,是先判断不为空,再遍历:if(!CollectionUtils.isEmpty(userInfoList)){for(UserInfo......
  • PHP 8.4 的新特性中,哪些对开发者来说最实用,最值得关注?
    随着PHP8.4版本的临近,开发者们正热切期待这一新版本的发布。PHP8.4不仅带来了一系列令人兴奋的新特性,而且这些更新在提升开发效率和代码质量方面具有重大意义。在这篇文章中,我们将探讨PHP8.4中对开发者来说最实用和最值得关注的特性。———JIT,即时编译器(JIT)的改进。JI......
  • Java服务端数据库连接:连接池的高级特性
    Java服务端数据库连接:连接池的高级特性大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!数据库连接池作为Java服务端应用中的核心组件,不仅需要提供基本的连接管理功能,还需要具备一些高级特性以满足复杂的业务需求。这些高级特性包括但不限于连接池的动......
  • Java的高级特性
    Java的高级特性概述:Lambda表达式Lambda表达式是Java8及更高版本中引入的一个重要特性,它提供了一种简洁的方式来表示匿名方法(即没有名称的方法)。Lambda表达式特别适用于实现仅有一个抽象方法的接口(这类接口被称为函数式接口)。Lambda表达式使得代码更加简洁、易于阅读,并且提高......
  • 海杂波幅度分布特性认知
    从统计学角度研究海杂波幅度分布特性无论在过去还是当前都属于海杂波特性认知研究中的重点关注对象,其所涵盖的研究内容主要涉及实测海杂波经验分布特性及其随雷达参数和环境参数的变化规律、幅度分布建模与参数估计、以及特定场景和雷达参数条件下的海杂波仿真问题。通过海杂波幅......
  • HTML5新特性速查手册:新增标签与属性一览
    前言:网页的相关概念:网址:我们在浏览器中输入的地址。网页:浏览器所呈现的每一个页面。网站:多个网页构成了一个网站。网页的标准:结构:HTML表现:CSS行为:JavaScript一、什么是HTML?HTML(是HyperTextMarkupLanguage的缩写)中文译名:超文本标记语言。各部分理解:......
  • 【CSS】三大特性
    目录层叠性层叠性原则继承性行高的继承性优先级选择器权重如下表所示优先级注意点权重叠加CSS有三个非常重要的三个特性:层叠性、继承性、优先级。层叠性相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样......
  • 【程序员必备】EditPlus:从文档界面到编程特性,全面升级你的编程体验!
    前言在科技日新月异的今天,正如乔布斯所言:“创新就是把事物联系起来的能力。”EditPlus正是这样一款集创新、高效与多功能于一体的文本编辑器,它以其卓越的性能和广泛的应用领域,在软件开发者和内容创作者中赢得了极高的声誉。这款工具是由韩国ES-Computing公司开发,自问世以来,凭......