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