我正在尝试实现这样的实用方法
boolean allNotNull( LocalDate... objects )
这样它就返回了 true
仅适用于有元素( objects
vararg 不是 null
)并且没有 null
的情况里面的元素。另外,我想使用 Streams 和 Options 以函数式风格实现它,而不涉及任何 if 语句。
解决方案似乎很明显:
private static boolean allNotNull( LocalDate... objects )
{
boolean allNotNull = Optional.ofNullable( objects )
.stream()
.flatMap( Arrays::stream )
.noneMatch( Objects::isNull );
return allNotNull;
}
但它总是返回 true
如果objects
可变参数是 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() );
}
提前致谢!
最佳答案
我没有尝试该代码,但它应该像这样工作(如果您坚持使用可选):
boolean allNotNull( LocalDate... objects ){
return Optional.ofNullable(objects)
.map(Arrays::stream)
.map(s -> s.noneMatch(Objects::isNull))
.orElse(false);
}
如果没有Options,你可以将其写为
boolean allNotNull( LocalDate... objects ){
return objects != null && Arrays.stream(objects).noneMatch(Objects::isNull);
}
关于JavaOptional.ofNullable(Object[]objects) 带有流和 boolean 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67521617/