首页 > 解决方案 > 带有流和布尔结果的 Java Optional.ofNullable(Object[] objects)

问题描述

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

boolean allNotNull( LocalDate... objects )

以便它true仅在有元素(objectsvararg 不是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如果objectsvararg 是,它总是返回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() );
}

提前致谢!

标签: javajava-stream

解决方案


我没有尝试代码,但它应该像这样工作(如果你坚持使用 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);
}

推荐阅读