java - 带有流和布尔结果的 Java Optional.ofNullable(Object[] objects)
问题描述
我正在尝试实现这样的实用方法
boolean allNotNull( LocalDate... objects )
以便它true
仅在有元素(objects
vararg 不是null
)并且其中没有null
元素的情况下返回。此外,我想使用 Streams 和 Optionals 以功能样式实现它,而不涉及任何 if 语句。
解决方案似乎很明显:
private static boolean allNotNull( LocalDate... objects )
{
boolean allNotNull = Optional.ofNullable( objects )
.stream()
.flatMap( Arrays::stream )
.noneMatch( Objects::isNull );
return allNotNull;
}
但true
如果objects
vararg 是,它总是返回null
。原因一定是Optional.stream()
返回这种情况,尽管有谓词Stream.empty()
,它总是返回:true
Assert.assertTrue( Stream.empty().noneMatch( o -> true )); //always true
Assert.assertTrue( Stream.empty().noneMatch( o -> false )); //also always true
我觉得很愚蠢,但我的问题是:有没有办法使用Optional.ofNullable()
输入可变参数(数组/集合)来实现这样的实用方法,只使用流和选项并避免 ifs?
以下是我的主要方法和一些测试:
public static void main( String[] args )
{
Assert.assertFalse( allNotNull( null ) );
Assert.assertFalse( allNotNull( LocalDate.now(), null, LocalDate.MIN ) );
Assert.assertTrue( allNotNull( LocalDate.MIN ) );
Assert.assertTrue( allNotNull( LocalDate.MIN, LocalDate.EPOCH, LocalDate.EPOCH ) );
Assert.assertFalse( allNotNull() );
}
提前致谢!
解决方案
我没有尝试代码,但它应该像这样工作(如果你坚持使用 Optionals):
boolean allNotNull( LocalDate... objects ){
return Optional.ofNullable(objects)
.map(Arrays::stream)
.map(s -> s.noneMatch(Objects::isNull))
.orElse(false);
}
没有 Optionals 你可以把它写成
boolean allNotNull( LocalDate... objects ){
return objects != null && Arrays.stream(objects).noneMatch(Objects::isNull);
}
推荐阅读
- javascript - 在 HTML 画布上显示许多高分辨率图像(地图平铺)
- esp32 - 如何跟踪 ESP32 中的堆内存泄漏问题?
- python - Django REST JSONParser - 删除换行符?
- mongodb - 如何使用带有 $push 的 ArrayFilter 插入子文档
- javascript - 在缩放时添加元素,D3
- python - 更新嵌套的 MongoDB 集合 (Pymongo)
- android - 如何通过智能手机上的应用程序断开 Android-auto
- php - 获取一个月中特定周的日期范围
- actions-on-google - 从谷歌助手访问时未关联帐户状态
- python - 使用 QSettings 保存 QRadioButtons 的状态未在 PyQt5 中正确保存值