JavaOptional.ofNullable(Object[]objects) 带有流和 boolean 结果

标签 java java-stream

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

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/

相关文章:

java - 根据值压缩列表

java - 需要有关 Java 中通配符泛型类型的帮助

java - 流中间操作 -> IllegalStateException

Java 8 : Is there a batter way to filter JSONArray?

java - 删除重复项并将收集的元素排序为 Map 的值

java - spring TransactionTemplate 和 SimpleJdbcTemplate 是线程安全的吗?

java - 使用新的 dateTime API 获取持续时间

java - 使用java分割十进制值(作为字符串)

Java8 整数流与 IntStream

java - 在这种情况下如何返回带有流的列表?