Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 Java 8流筛选器始终返回空列表_Java 8_Java Stream - Fatal编程技术网

Java 8 Java 8流筛选器始终返回空列表

Java 8 Java 8流筛选器始终返回空列表,java-8,java-stream,Java 8,Java Stream,我想过滤signedOn字段为空的所有传输。当我运行第一段代码时,很清楚哪些是空的,哪些不是空的,并且记录正确,但是当我运行流过滤器时,它返回一个空列表,我似乎找不到它的问题所在。。。signedOn是一个日期字段 无论条目是否为空,此操作都会工作并记录所有条目: for (Transfer transfer : route.getTransferCollection()) { if (transfer.getSignedOn() == null) {

我想过滤signedOn字段为空的所有传输。当我运行第一段代码时,很清楚哪些是空的,哪些不是空的,并且记录正确,但是当我运行流过滤器时,它返回一个空列表,我似乎找不到它的问题所在。。。signedOn是一个日期字段

无论条目是否为空,此操作都会工作并记录所有条目:

    for (Transfer transfer : route.getTransferCollection()) {
        if (transfer.getSignedOn() == null) {
            logInfo("This transfer is null");
        } else if (transfer.getSignedOn() != null) {
            logInfo("This transfer is not null");
        }
    }
这将返回一个空列表:

    return route.getTransferCollection()
            .stream()
            .filter(transfer -> transfer.getSignedOn() == null)
            .collect(Collectors.toList());
}

您可以将您的语句记录在
过滤器
本身中

 return route.getTransferCollection()
        .stream()
        .filter(transfer -> {
                boolean test = transfer.getSignedOn() == null;
                if(test){
                   // log wathever
                } else {
                   // log diff
                }
                return test
               })
        .collect(Collectors.toList());
顺便说一句,您可以使用
peek
来登录streams内部,但在您的案例中使用它需要对null进行两次测试

您还可以使用不同的采集器来获取空的采集器和非空的采集器(不带
过滤器
):


似乎
route.getTransferCollection()
已经是一个空列表。请尝试这样检查:

route.getTransferCollection()
    .stream()
    .forEach(System.out::println);  // or .forEach(e -> logInfo(e));

查看是否会打印任何内容。

getTransferCollection()的返回类型是什么?过滤器中的日志语句如何?@Harald这是一个集合你说“我想过滤”,但你原来的循环没有过滤,它只做日志记录。然后,编写一个流操作,返回一个
列表
,但原始循环不生成列表。因此,这些操作不是等效的,并且与您关于要执行的操作的描述不匹配。当您在不知道自己真正想要什么的情况下开始编写代码时,结果很少是您想要的。或者可能是,但你不知道。@Holger这正是你在评论中建议的,我从来没有想过它会与JPA有关,但你知道什么?非常感谢你的帮助!我就这样尝试过,但它根本没有记录任何东西:/I我不知道发生了什么,所以我用它替换了smth相当原始的,比如a for,当它为空时会添加到另一个列表中,因为今天是星期天,我想去home@brightpants这真的很奇怪,但是如果没有看到您的entirr代码,就很难判断发生了什么。你也许能以全新的思维准确地看到明天发生的事情(在我看来,查看代码总是好的)结果为空有两种可能:
route.getTransferCollection()
已经为空,或者所有传输都有一个签名数据(请注意,过滤器定义了要保留的元素,而不是要删除的元素)。也许您可以在流之前记录
route.getTransferCollection()
的大小,以查看它是否为空。stream.peek():API注意:此方法的存在主要是为了支持调试。在本例中,它肯定不会打印任何内容。您的流上没有终端操作。我的错误,已将
peek
更改为
forEach
。谢谢你,布莱恩·戈茨!
route.getTransferCollection()
    .stream()
    .forEach(System.out::println);  // or .forEach(e -> logInfo(e));