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

时间:2017-12-10 17:15:19

标签: java-8 java-stream

我想过滤signedOn字段为null的所有传输。当我运行第一段代码时,它清楚哪些是空的,哪些不是,并且它们被正确记录,但是当我运行流过滤器时,它返回一个空列表,我可以'似乎找到了它的问题...... signedOn是一个Date字段。

这样可以记录所有条目是否为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());
}

2 个答案:

答案 0 :(得分: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());

你可以使用peek来记录内部流btw,但在你的情况下使用它需要测试两次null。

您也可以使用不同的收集器来获取null和非{(1}})的收集器:

filter

答案 1 :(得分:2)

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

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

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