当前位置: 首页 > news >正文

java中Optional类的使用和注意采坑

一  Optional类的使用

1.1. 闭坑案例

1.1.1 代码

public class Bianli {
public static void main(String[] args) {
ChatInfo chatInfo = new ChatInfo();
chatInfo.setId(1);
List<Message> messageList = new ArrayList<>();
Message  message = new Message();
message.setRole("user4");
message.setContent("nihao");
messageList.add(message);
Message  message2 = new Message();
message2.setRole("user3");
message2.setContent("nihao222");
messageList.add(message2);
chatInfo.setMessageList(messageList);
//
       Optional<Message> op = chatInfo.getMessageList().stream().filter(m -> m.getRole().equals("user")).findFirst();
//   Optional<Message> op = chatInfo.getMessageList().stream().filter(m -> "user".equals(m.getRole())).findFirst();
           System.out.println("op:"+op);
//  System.out.println("op:"+op.get());
////        System.out.println("op:"+op.isPresent());
         if(!op.isPresent()||op.get()==null){
System.out.println("null ....");
         }
    }
}

1.1.2 作用

chatInfo.getMessageList().stream().filter(m -> m.getRole().equals("user")).findFirst();

作用:返回流中第一个符合条件的元素(按照流的顺序),并用 Optional 包装结果。

findFirst() 应该总是与 filter() 配合使用,且由于返回 Optional,后续操作必须考虑空值处理(如 isPresent() 检查或使用 orElse() 等方法)。

1.1.3 风险

风险说明:

.filter(m -> "user".equals(m.getRole()))  // 即使 m.getRole() 为 null 也安全

op.get() 的安全隐患:直接调用 get() 是危险操作:

当 Optional 为空时(op.isPresent() == false),调用 get() 会抛出:java.util.NoSuchElementException: No value present

Optional<Integer> empty = Optional.empty();

empty.get(); // 抛出 NoSuchElementException(危险!)

使用安全模式:必须先检查isPresent()

如:

Optional<Integer> empty = Optional.empty();

If(empty.isPresent()){

empty.get();

}

http://www.dtcms.com/a/312897.html

相关文章:

  • DBMS设计 之2 从数据中台到三种中台
  • 常见的框架漏洞(Thinkphp,spring,Shiro)
  • 常见的框架漏洞
  • IO流-对象流
  • MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接
  • 均线:从市场脉搏到量子计算的时空密码
  • K8S几种常见CNI深入比较
  • Qt::AA_DontCreateNativeWidgetSiblings使用注意事项
  • 游戏设计原理
  • Flutter开发 dart异步
  • Linux网络编程 ---五种IO模型
  • 基于 Spring Boot + Vue 实现人脸采集功能全流程
  • Python----大模型(从预训练到分布式优化的核心技术解析)
  • 2、RabbitMQ的5种模式基本使用(Maven项目)
  • 迈向透明人工智能: 可解释性大语言模型研究综述
  • ubuntu apt安装与dpkg安装相互之间的关系
  • Python 实例属性与方法命名冲突:一次隐藏的Bug引发的思考
  • 途游Android面试题及参考答案
  • 【GitHub探索】Agent开发平台CozeStudio开源版本踩坑体验
  • pycharm上如何添加conda环境
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • 为何:内存数据断电即逝,硬盘数据牢笼长存
  • LangChain框架概念及简单的使用案例
  • ABP VNext + CloudEvents:事件驱动微服务互操作性
  • 计算机核心概念辨析与解析
  • 24SpringCloud黑马商城部署Java应用后浏览器访问数据库不显示数据的解决办法
  • 可持久化线段树 系列 题解
  • 【Python✨】解决 Conda 安装 MoviePy 报错问题
  • GitCode疑难问题诊疗
  • 12.Redis 主从复制