如何正确判断Optional流中是否存在未包含值的元素?
解决Optional流的空值判断需求
别纠结啦,你完全可以在Stream.of()创建的流中使用Optional的实例方法来实现需求,之前的误解完全没必要~ 先上正确代码:
return Stream.of(a.getBestArrivalTime(), a.getBestDepartureTime(), a.getScheduledArrivalTime(), a.getScheduledDepartureTime()) .anyMatch(opt -> !opt.isPresent()); // 如果你用的是Java 11及以上版本,还能简化成更直观的写法: // return Stream.of(...) // .anyMatch(Optional::isEmpty);
原代码的问题出在哪?
你之前用Objects::isNull是在检查Optional对象本身是否为null,但你的真实需求是判断Optional内部是否没有值。举个例子:如果某个字段返回的是Optional.empty(),这个Optional对象本身并不是null,所以Objects::isNull会返回false,根本检测不到空的Optional,逻辑自然就错了。
关于你对Stream.of()的误解
你误以为Stream.of()是静态方法就不能用Optional::isPresent?这真的是个小误区~ Stream.of()只是用来把多个Optional元素打包成流的工具,流中的每个元素都是Optional的实例,当然可以调用它的isPresent()实例方法——流的创建方式和元素的方法调用完全不冲突。
给你个简单的验证例子:
Optional<String> filledOpt = Optional.of("test"); Optional<String> emptyOpt = Optional.empty(); boolean hasEmptyOptional = Stream.of(filledOpt, emptyOpt).anyMatch(opt -> !opt.isPresent()); // 这里hasEmptyOptional的值是true,完全符合你的预期
这样就能准确判断流中是否存在任意一个未包含值的Optional元素了。
内容的提问来源于stack exchange,提问作者pqa1222
相关产品推荐
相关产品推荐

