首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 8 的 Optional:提高代码安全性与可读性

Java 8 的 Optional:提高代码安全性与可读性

作者头像
程序猿川子
发布于 2025-07-22 08:42:48
发布于 2025-07-22 08:42:48
10700
代码可运行
举报
运行总次数:0
代码可运行
请在此添加图片描述
请在此添加图片描述

第一部分:了解 NullPointerException

NullPointerException 的背景

NullPointerException 通常在试图访问对象的属性或调用其方法时抛出,而对象本身为 null。这是一个编程错误,通常是由于未正确初始化对象或未能妥善处理返回的 null 值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public class NullPointerExample {
   public static void main(String[] args) {
       String str = null;
       // 这里将抛出 NullPointerException
       System.out.println(str.length());
   }
}
常见场景

常见的 NullPointerException 场景包括未初始化的对象、从方法返回 null 等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public class User {
   private String name;
   public User(String name) {
       this.name = name;
   }
   public String getName() {
       return name;
   }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public class UserService {
   public String getUserName(User user) {
       // 如果 user 为 null,将抛出 NullPointerException
       return user.getName();
   }
}

避免 NullPointerException 的传统方法

  • 使用条件语句进行防御性编程:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public String getUserName(User user) {
   if (user != null) {
       return user.getName();
   }
   return "Unknown";
}

第二部分:Java 8 Optional 的引入

Optional 的概念

Optional 是一个容器,表示一个可能存在或不存在的值。它的设计目的是提供一种更清晰的方式来处理缺失值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码import java.util.Optional;

public class OptionalExample {
   public static void main(String[] args) {
       Optional<String> optionalValue = Optional.of("Hello");
       System.out.println(optionalValue.get()); // 输出 Hello
   }
}

Optional 的基本操作

创建 Optional 对象的几种方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码Optional<String> emptyOptional = Optional.empty(); // 创建一个空的 Optional
Optional<String> nonNullOptional = Optional.of("Hello"); // 创建一个包含值的 Optional
Optional<String> nullableOptional = Optional.ofNullable(null); // 创建一个空的 Optional

第三部分:深入 Optional 的 API

创建与使用

Optional.of(value):如果 valuenull,则抛出 NullPointerException

Optional.ofNullable(value):允许 null 值的创建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public class OptionalCreation {
   public static void main(String[] args) {
       // 使用 of(),如果 value 是 null,将抛出异常
       try {
           Optional<String> optional = Optional.of(null);
       } catch (NullPointerException e) {
           System.out.println("Caught NullPointerException!");
       }
       // 使用 ofNullable(),允许 null
       Optional<String> optionalNullable = Optional.ofNullable(null);
       System.out.println(optionalNullable.isPresent()); // 输出 false
   }
}

检查 Optional

使用 isPresent() 检查是否有值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码   Optional<String> optionalStr = Optional.of("Hello");
   if (optionalStr.isPresent()) {
   System.out.println(optionalStr.get()); // 输出 Hello
   }

获取值的不同方式

orElse() 提供默认值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码String value = optionalStr.orElse("Default Value");
System.out.println(value); // 输出 Hello

orElseGet() 提供延迟生成的默认值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码String value = optionalStr.orElseGet(() -> "Generated Default Value");
System.out.println(value); // 输出 Hello

第四部分:使用 Optional 的最佳实践

何时使用 Optional

适合用于方法返回值,明确表示可能缺失的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public Optional<User> findUserById(String id) {
   // 假设从数据库中查找用户
   return Optional.ofNullable(findUserInDatabase(id));
}

与传统 null 值处理的对比

使用 Optional 可以减少防御性编程的需求,使代码更简洁。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public String getUserName(Optional<User> userOptional) {
   return userOptional.map(User::getName).orElse("Unknown");
}

在方法签名中使用 Optional

API 设计时,使用 Optional 明确传达 API 用户的意图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public Optional<String> getUserEmail(User user) {
   return Optional.ofNullable(user).map(User::getEmail);
}

第五部分:Java 8 API 中的 Optional

常见的 Java 8 API 使用

在流(Stream)中使用 Optional

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码List<User> users = Arrays.asList(new User("zzz"), new User("vvv"));
Optional<User> user = users.stream()
                           .filter(u -> u.getName().equals("vvv"))
                           .findFirst();
user.ifPresent(u -> System.out.println("Found user: " + u.getName())); 
// 输出 Found user: vvv

实际案例分析

假设我们有一个用户管理系统,用户可能不存在。使用 Optional 处理用户的查找:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码public Optional<User> findUserById(String id) {
   return users.stream()
               .filter(user -> user.getId().equals(id))
               .findFirst();
}

第六部分:Optional 的局限性

性能考量

Optional 是一个对象,可能会引入一定的内存开销,尤其在性能敏感的应用中。需要谨慎使用,避免在高性能要求的场景中滥用。

不适用的情况

过度使用 Optional,例如在集合中存储 Optional,会导致不必要的复杂性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 体验AI代码助手 代码解读复制代码List<Optional<User>> optionalUsers = new ArrayList<>();
// 不推荐,直接存储 User 对象会更合适

Optional 提供了一种优雅的方式来处理可能缺失的值,显著减少了 NullPointerException 的风险。尽管它有一定的局限性,但在适当的场合使用 Optional 可以提高代码的可读性和安全性。鼓励开发者在设计 API 和实现业务逻辑时,充分利用 Optional 的优势。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​浅析多模态大模型的前世今生
前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后,到处刷屏。大模型的多模态能力到底是怎么来的?今天来分享一下多模态相关的一些工作和个人的理解。
腾讯技术工程官方号
2023/11/01
4.4K0
​浅析多模态大模型的前世今生
腾讯发表多模态综述,什么是多模态大模型
多模态大语言模型(MLLM)是近年来兴起的一个新的研究热点,它利用强大的大语言模型作为大脑来执行多模态任务。MLLM令人惊讶的新兴能力,如基于图像写故事和无OCR的数学推理,在传统方法中是罕见的,这表明了一条通往人工通用智能的潜在道路。在本文中,追踪多模态大模型最新热点,讨论多模态关键技术以及现有在情绪识别上的应用。
存内计算开发者
2024/05/14
4.4K0
腾讯发表多模态综述,什么是多模态大模型
BLIP:用更干净更多样的数据进行多模态预训练,性能超越CLIP!代码已开源!
视觉语言预训练 (VLP) 提高了许多视觉语言任务的性能。但是,大多数现有的预训练模型仅在基于理解的任务或基于生成的任务中表现出色。此外,通过使用从web收集的嘈杂的图像-文本对来扩展数据集,在很大程度上实现了性能改进,但这是监督的次优来源。
CV君
2022/03/30
5.9K0
BLIP:用更干净更多样的数据进行多模态预训练,性能超越CLIP!代码已开源!
「理解和生成」的大一统!华人一作提出BLIP模型,「视觉+语言」任务多项SOTA
视觉语言预训练(Vision-language pre-training)的相关研究在各种多模态的下游任务中已经证明了其强大的实力。
新智元
2022/02/24
1.9K0
「理解和生成」的大一统!华人一作提出BLIP模型,「视觉+语言」任务多项SOTA
ChatGPT多模态命名实体识别
多模态命名实体识别(MNER)最近引起了广泛关注。 用户在社交媒体上生成大量非结构化内容,主要由图像和文本组成。这些帖子具有与社交媒体相关的固有特征,包括简洁和非正式的写作风格。 这些独特的特征对传统的命名实体识别(NER)方法提出了挑战。
E绵绵
2024/11/09
3260
ChatGPT多模态命名实体识别
CVPR 2022:图像分类+图文匹配=统一多模态对比学习框架
目前CV领域中包括两种典型的训练模式,第一种是传统的图像分类训练,以离散的label为目标,人工标注、收集干净、大量的训练数据,训练图像识别模型。第二种方法是最近比较火的基于对比学习的图文匹配训练方法,利用图像和其对应的文本描述,采用对比学习的方法训练模型。这两种方法各有优劣,前者可以达到非常高的图像识别精度、比较强的迁移能力,但是依赖人工标注数据;后者可以利用海量噪声可能较大的图像文本对作为训练数据,在few-shot learning、zero-shot learning上取得很好的效果,但是判别能力相比用干净label训练的方法较弱。今天给大家介绍一篇CVPR 2022微软发表的工作,融合两种数据的一个大一统对比学习框架。
圆圆的算法笔记
2022/09/22
7.1K0
CVPR 2022:图像分类+图文匹配=统一多模态对比学习框架
【论文复现】BLIP:VLP任务的新框架
视觉语言预训练(VLP)提高了许多视觉语言任务的性能。然而,大多数现有的预训练任务只擅长基于理解的任务或者基于生成的任务。此外,同时使用Web收集的有噪声的图像-文本对来扩展数据集虽然在很大程度上提高了性能,但这是一个次优的监督来源。   BLIP是一个新的VLP框架,它可以灵活的转移到视觉语言理解和生成任务。BLIP通过引导字幕有效地利用了有噪声的网络数据,其中字幕生成器生成合成字幕,滤波器去除有噪声的字幕
Eternity._
2024/12/13
4460
【论文复现】BLIP:VLP任务的新框架
【大模型学习 | BLIP原理】
Image-grounded text encoder: Transformer block中,在self-attention(SA)和Feed forward network(FFN)之间加入了Cross Attention(CA),融入图像特征信息,Encode为图文对的特征表示;
九年义务漏网鲨鱼
2025/06/30
7430
【大模型学习 | BLIP原理】
【大模型学习 | MINIGPT-4原理】
🟢 Q-Former包含了两个transformer子模块:(1)Image Transformer (特征提取) (2) Text transformer (作为文本编码器和解码器) ;
九年义务漏网鲨鱼
2025/07/02
6090
【大模型学习 | MINIGPT-4原理】
统一多模态 Transformer 架构在跨模态表示学习中的应用与优化
随着人工智能的发展,文本与图像等多模态数据的统一建模成为研究热点。统一多模态 Transformer(Unified Multimodal Transformer, UMT)正逐步展现其强大的泛化能力,尤其在图文检索、图像生成、图文问答等任务中展现卓越性能。本文将从原理、架构、实现细节到实验效果,深入解析一个简化版的统一多模态 Transformer 模型的构建过程。
一键难忘
2025/07/22
3390
【大模型学习 | BLIP2原理】
🟢 Q-Former包含了两个transformer子模块:(1)Image Transformer (特征提取) (2) Text transformer (作为文本编码器和解码器) ;
九年义务漏网鲨鱼
2025/07/01
7530
【大模型学习 | BLIP2原理】
【BLIP】VLP任务的新框架
  视觉语言预训练(VLP)提高了许多视觉语言任务的性能。然而,大多数现有的预训练任务只擅长基于理解的任务或者基于生成的任务。此外,同时使用Web收集的有噪声的图像-文本对来扩展数据集虽然在很大程度上提高了性能,但这是一个次优的监督来源。   BLIP是一个新的VLP框架,它可以灵活的转移到视觉语言理解和生成任务。BLIP通过引导字幕有效地利用了有噪声的网络数据,其中字幕生成器生成合成字幕,滤波器去除有噪声的字幕。
Srlua
2024/12/10
2290
【BLIP】VLP任务的新框架
多模态算法综述
纵览:视频理解算法经过了手工特征-> CNN -> Two stream ->3D卷积 ->Transformer的一步步演进,不断使模型具有更强的表征能力
yuyang
2022/07/12
3K0
一文综述,未来已来 | 视觉和大语言模型的未来是什么?必然结连理实现多模态大模型
多模态模型结合了多种数据类型,如图像、文本、音频等。传统的语言模型(LLMs)主要针对文本数据进行训练和应用,但在理解其他数据类型方面存在局限性。纯文本语言模型,如GPT-3、BERT和RoBERTa,在文本生成和编码等任务上表现出色,但在理解和处理其他数据类型方面存在不足。
集智书童公众号
2023/11/29
1.8K0
一文综述,未来已来 | 视觉和大语言模型的未来是什么?必然结连理实现多模态大模型
【论文复现】ChatGPT多模态命名实体识别
多模态命名实体识别(MNER)技术近期备受瞩目。随着社交媒体上涌现出海量由图像与文本交织而成的非结构化内容,这些帖子展现出了社交媒体特有的属性,诸如言简意赅及不拘一格的表达方式。这些独特之处,无疑给传统的命名实体识别(NER)手段带来了前所未有的挑战。
Eternity._
2025/05/22
2540
【论文复现】ChatGPT多模态命名实体识别
多模态统一框架BLIP系列工作,从BLIP到InstructBLIP
这篇文章整理了Salesforce Research在多模态领域提出的NLIP图文统一框架,利用图文数据训练能够解决各类图文任务的统一模型(图文匹配、看图说话等)。共包含3个工作:BLIP、BLIP-2、InstructBLIP。三者的核心点如下:
圆圆的算法笔记
2023/08/17
4K0
多模态统一框架BLIP系列工作,从BLIP到InstructBLIP
SimVLM:拒绝各种花里胡哨!CMU&Google提出弱监督极简VLP模型,在多个多模态任务上性能SOTA
随着视觉和文本表示联合建模的进展,视觉语言预训练(VLP)在许多多模态下游任务上取得了非常好的性能。然而,对包括图像描述和区域标签在内的标注信息,限制了这一方向的进一步方法。此外。随着引入多个数据集特定的目标,预训练过程也变得更加复杂。在这项工作中,作者放宽了这些约束,提出了一个极简的预训练框架,名为Simple Visual Language Model (SimVLM)。
CV君
2021/09/27
9660
SimVLM:拒绝各种花里胡哨!CMU&Google提出弱监督极简VLP模型,在多个多模态任务上性能SOTA
华为诺亚开源首个亿级中文多模态数据集-悟空,填补中文NLP社区一大空白
选自arXiv作者:Jiaxi Gu等 机器之心编译编辑:Juniper 华为诺亚方舟实验室的研究者提出了一个大规模的中文的跨模态数据库 ——「悟空」,并在此基础上对不同的多模态预训练模型进行基准测试,有助于中文的视觉语言预训练算法开发和发展。 在大数据上预训练大规模模型,对下游任务进行微调,已经成为人工智能系统的新兴范式。BERT 和 GPT 等模型在 NLP 社区中越来越受欢迎,因为它们对广泛的下游任务甚至零样本学习任务具有很高的可迁移性,从而产生了 SOTA 性能。最近的工作,如 CLIP、ALIGN
机器之心
2022/03/04
1K0
如何使用多类型数据预训练多模态模型?
在训练过程中使用更多数据一直是深度学习提效的重要方法之一,在多模态场景也不例外。比如经典的CLIP模型,使用了大规模的网络图文匹配数据进行预训练,在图文匹配等任务上取得非常好的效果。
圆圆的算法笔记
2022/09/22
2.4K0
如何使用多类型数据预训练多模态模型?
剑桥团队开源:赋能多模态大模型RAG应用,首个预训练通用多模态后期交互知识检索器
尽管多模态大模型(例如 GPT4-Vision、Gemini 等)展现出了强大的通用图文理解能力,它们在回答需要专业知识的问题时表现依然不尽人意。即使 GPT4-Vision 也无法回答知识密集型问题(图一上),这成为了很多企业级落地应用的瓶颈。
机器之心
2024/03/26
1.6K0
剑桥团队开源:赋能多模态大模型RAG应用,首个预训练通用多模态后期交互知识检索器
推荐阅读
相关推荐
​浅析多模态大模型的前世今生
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档