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