【问题标题】:Checking if any element of stream is not present检查流的任何元素是否不存在
【发布时间】:2020-03-19 12:24:47
【问题描述】:

我有很多选项。如果流的任何元素不存在,我想返回 true,如果所有元素都存在,我想返回 false。

代码:

return Stream.of(a.getBestArrivalTime(),
        a.getBestDepartureTime(),
        a.getScheduledArrivalTime(),
        a.getScheduledDepartureTime())
        .anyMatch(Objects::isNull);

它检查元素是否为空,但它是错误的,因为它不适用于可选变量。我想我需要使用Optional::isPresent,但我不能使用它,因为Stream.of() 是一个静态方法。 流中的字段只是从对象中选择的字段。

【问题讨论】:

  • "我想我需要使用 Optional::isPresent" - 好吧,你试过了吗?为我工作。
  • anyMatch(o -> !o.isPresent()) 呢?
  • 看起来你不能分享你的原始代码。因此,请创建一个简短的、最小的可重现示例来模仿您的代码 - stackoverflow.com/help/minimal-reproducible-example

标签: java java-stream optional


【解决方案1】:

您可以按照自己的预期编写代码,例如:

return Stream.of(a.getBestArrivalTime(), a.getBestDepartureTime(),
                 a.getScheduledArrivalTime(), a.getScheduledDepartureTime())
             .anyMatch(o -> !o.isPresent());//(Java-11) anyMatch(Optional::isEmpty)

【讨论】:

    【解决方案2】:

    怎么了

    return !Stream.of(a.getBestArrivalTime(),
        a.getBestDepartureTime(),
        a.getScheduledArrivalTime(),
        a.getScheduledDepartureTime())
        .allMatch(Optional::isPresent);
    

    ?

    编辑:我对您对“不能从静态上下文引用非静态方法”的错误假设的评论的证明:

    import java.util.Optional;
    import java.util.stream.Stream;
    
    public class Application {
    
        public static void main (String[] args) {
            final boolean allMatch = !Stream.of(Optional.empty(), Optional.empty())
                .allMatch(Optional::isPresent);
            System.out.println(allMatch);
        }
    }
    

    【讨论】:

    • "不能从静态上下文引用非静态方法。" - 与此无关,抱歉
    • 也许只需添加一个最小的可重现示例,而不仅仅是代码的 sn-ps,那么我们可以提供帮助而无需推测。
    • @pqa1222 你应该更具体地说明“它停止工作”。我很确定,您放入流中的元素之一是不是Optional。正如in this answer 所说,错误消息“不能从静态上下文引用非静态方法”。几乎总是在泛型类型不匹配时出现,尤其是在方法引用的上下文中。 javac 只是 #?@X 何时应该报告实际错误(Eclipse 也好不到哪里去,它只是产生了不同的,但仍然具有误导性的错误消息)。
    • @daniu Stream API 的所有匹配操作都是惰性的。 allMatch 在遇到第一个不匹配的元素时停止。
    • @pqa1222 您尚未包含确切的错误消息。正如 Smutje 所说,您应该在您的问题中包含更多代码,在最好的情况下是一个可重现的示例。添加确切的错误消息并尝试使用命令行javac 来查看是否收到不同的错误消息。
    猜你喜欢
    • 2012-11-20
    • 2023-03-09
    • 2010-09-11
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多