Java可选。具有流和布尔结果的可用对象(对象[]对象)

Java可选。具有流和布尔结果的可用对象(对象[]对象),java,java-stream,Java,Java Stream,我正在尝试实现这样一个实用方法 boolean allNotNull( LocalDate... objects ) 因此,仅当存在元素(对象vararg不是null)且其中没有null元素时,它才返回true。另外,我希望使用流和选项以函数式的方式实现它,并且不涉及任何if语句 解决办法似乎显而易见: private static boolean allNotNull( LocalDate... objects ) { boolean allNotNull = Optional.o

我正在尝试实现这样一个实用方法

boolean allNotNull( LocalDate... objects )
因此,仅当存在元素(
对象
vararg不是
null
)且其中没有
null
元素时,它才返回
true
。另外,我希望使用流和选项以函数式的方式实现它,并且不涉及任何if语句

解决办法似乎显而易见:

private static boolean allNotNull( LocalDate... objects )
{

    boolean allNotNull = Optional.ofNullable( objects )
                                 .stream()
                                 .flatMap( Arrays::stream )
                                 .noneMatch( Objects::isNull );
    return allNotNull;
}
但是如果
objects
vararg是
null
,它总是返回
true
。原因必须是
Optional.stream()
在这种情况下返回
stream.empty()
,尽管谓词为:

    Assert.assertTrue( Stream.empty().noneMatch( o -> true ));   //always true
    Assert.assertTrue( Stream.empty().noneMatch( o -> false ));  //also always true
我觉得自己很愚蠢,但我的问题是:有没有一种方法可以实现像这样的实用方法,使用
Optional.ofNullable()
只使用streams和Optional并避免使用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 objects != null && Arrays.stream(objects).noneMatch(Objects::isNull);
}

当您的
可选
不存在时(is
null
),可以使用
OrElse
将只包含
null
的数组提交到流程的其余部分(is
null
),只需在方法的开头添加
if(Objects.isNull(Objects)){return false;}
。@Turing85是的,这会起作用,但我只是想确保我不会错过一个使用可选的.ofNullable()@julien.gib的机会。是的,我希望它可能会起作用,但我不知道该放在哪里。可能是在调用stream()之前的某个地方,但在orElse失败后如何调用stream()?是的,它正在工作,非常感谢,没有想到嵌套流!谢谢!。。。或者,为了确保该方法做到它所说的,您可以
allMatch(Objects::nonNull)
boolean allNotNull( LocalDate... objects ){
   return objects != null && Arrays.stream(objects).noneMatch(Objects::isNull);
}