一 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(); } |