Java 8 Stream Filter总是返回一个空列表

bri*_*nts 5 java-8 java-stream

我想过滤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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

这将返回一个空列表:

    return route.getTransferCollection()
            .stream()
            .filter(transfer -> transfer.getSignedOn() == null)
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 2

filter您可以在其内部记录您的语句

 return route.getTransferCollection()
        .stream()
        .filter(transfer -> {
                boolean test = transfer.getSignedOn() == null;
                if(test){
                   // log wathever
                } else {
                   // log diff
                }
                return test
               })
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可以使用它peek来记录流内部,但在您的情况下使用它需要对 null 进行两次测试。

您还可以使用不同的收集器来获取 null 和非 null 的收集器(不带filter):

.collect(Collectors.partitioningBy(transfer -> transfer.getSignedOn() == null))
Run Code Online (Sandbox Code Playgroud)

  • @brightpants 这真的很奇怪,但是如果没有看到你的整个代码,很难判断发生了什么。你也许能够以全新的心态准确地看到明天会发生什么(在我看来,检查你的代码总是好的) (2认同)