无法从 Stream<T> 转换为布尔值

Cannot convert from Stream<T> to boolean

我正在尝试根据存在于此 BOLReference 的对象列表之一的内部对象中的键来过滤 BOLReference 对象列表。

List<BOLReference> bolRef = complianceMongoTemplate.find(findQuery, BOLReference.class);

Optional<BOLReference> bref = bolRef.stream().filter(br -> br.getWorkflowExceptions().stream()
                        .filter(bk -> bk.getBusinessKeyValues().get(businessKey)
                        .equalsIgnoreCase("ABCD1234"))).findFirst();

这样做时我收到错误:

Cannot convert from Stream<WorkFlowExceptions> to boolean

我的 BOLReference 如下所示:

private String ediTransmissionId;
private List<WorkflowExceptions> workflowExceptions;

我的 WorkflowExceptions 看起来像:

private String category;
private Map<String,String> businessKeyValues;
Optional<BOLReference> bref = bolRef.stream()
    .filter(br -> 
        br.getWorkflowExceptions().stream()
            .anyMatch(bk ->
                bk.getBusinessKeyValues().get(businessKey)
                    .equalsIgnoreCase("ABCD1234")))
    .findFirst();

失败anyMatch我想。

过滤器子句 return 不是布尔值而是流。这会导致问题,因为您的第一个过滤器需要一个布尔结果,但从第二个过滤器获取流。您可以改用 anyMatch 来获得所需的结果。

您可以通过在更多行上格式化流表达式并将复杂的逻辑提取到方法中来提高流表达式的可读性。

您可以像这样修复和重构它:

String businessKey = null;
String targetValue = "ABCD1234";

Optional<BOLReference> bref = bolReferences.stream()
    .filter(br -> br. hasBusinessKey(businessKey, targetValue))
    .findFirst();

并且:

public class BOLReference {

    // ...

    public boolean hasBusinessKey(String key, String value) {
        return getWorkflowExceptions().stream()
            .anyMatch(wfe -> wfe.hasBusinessKey(key, value));
    }
}

并且:

public class WorkflowExceptions {

    // ...

    public boolean hasBusinessKey(String key, String value) {
        return getBusinessKeyValues().get(key).equalsIgnoreCase(value);
    }
}