如何简洁判断Optional值存在且与指定值相等?
检查Optional值是否存在且等于指定值的方法
日常开发里有两种常用方式:
- 基础写法:先通过
isPresent()确认值存在,再用get()取出后做相等判断
Optional<String> opt = Optional.of("test"); if (opt.isPresent() && opt.get().equals("test")) { // 执行对应逻辑 }
- 更优雅的链式写法:用
filter()筛选符合条件的元素,再判断是否存在
Optional<String> opt = Optional.of("test"); if (opt.filter(val -> val.equals("test")).isPresent()) { // 执行对应逻辑 }
filter()会保留满足lambda条件的Optional值,要是原Optional为空或者值不符合条件,都会返回空Optional,后续用isPresent()判断就行。
优化给定代码的条件判断逻辑
先说明:原代码存在潜在问题——order是Optional<Order>类型,直接调用order.getCustomer()会编译报错(Optional类没有这个方法),正确逻辑应该是先确认order存在,再调用其getCustomer()方法(假设Order类的getCustomer()返回Optional<Customer>)。而且原代码如果order为空,调用get()会抛出NoSuchElementException,必须先判断order的存在性。
下面是几种简洁的优化写法:
写法一:用flatMap+filter+isPresent链式判断
Optional<Order> order = getOrder(); if (order.flatMap(Order::getCustomer) .filter(customer -> customer.equals(INTERNAL_CUSTOMER)) .isPresent()) { return; }
flatMap(Order::getCustomer):把Optional<Order>转换为Optional<Customer>(因为getCustomer()返回Optional<Customer>,flatMap会直接展开嵌套的Optional)filter(...):筛选出和INTERNAL_CUSTOMER相等的CustomerisPresent():判断是否存在符合条件的结果
写法二:用ifPresent省略显式if判断
如果只是要在符合条件时直接返回,用ifPresent结合链式调用更简洁:
Optional<Order> order = getOrder(); order.flatMap(Order::getCustomer) .filter(INTERNAL_CUSTOMER::equals) .ifPresent(customer -> { return; });
要是方法是void类型,还能再简化:
getOrder().flatMap(Order::getCustomer) .filter(INTERNAL_CUSTOMER::equals) .ifPresent(customer -> {});
注意点
- 尽量别直接用
get()方法,Optional为空时会抛出异常,链式调用既安全又易读。 - 用方法引用
INTERNAL_CUSTOMER::equals代替lambda,能让代码更简洁。
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

