【问题标题】:Java 8 Stream implementation for nested documents returned from MongoDB从 MongoDB 返回的嵌套文档的 Java 8 Stream 实现
【发布时间】:2018-08-28 18:36:05
【问题描述】:

我有一个嵌套文档的 MongoDB 集合,如下所示。我正在尝试读取 TestCase 对象中的标签。现在我的实现非常基础,有 4 个 for 循环。我是 java8 的新手,我想使用流或任何简单的方法来读取嵌套数据集。

class TestResults {
        public String ID;   
        DateTime timeStamp;
        List<TestCapability> testCapability;
}

class TestCapability {
        public String ID;   
        DateTime timeStamp;
        List<TestSuite> testSuite;
}

class TestSuite {
        public String ID;   
        DateTime timeStamp;
        List<TestCase> testCase;
}

class TestCase {
        public String ID;   
        DateTime timeStamp;
        List<TestSteps> testSteps;
        private Set<String> tags = new HashSet<>();
}

我目前的实现很糟糕如下

    for (TestResult testResult : testResults) {
        for (TestCapability capability : testResult.getTestCapabilities()) {
            for (TestSuite testSuite : capability.getTestSuites()){
                for (TestCase testCase : testSuite.getTestCases()) {
                    for (Feature feature : featureDetails) { 
                        if (testCase.getTags().contains(feature.getsNumber())){
                            testResultsAuditResponse.setsId(feature.getsId());
                            testResultsAuditResponse.setsNumber(feature.getsNumber());
                            testResultsAuditResponse.setsName(feature.getsName());
                            testResultsAuditResponse.setsStatus(feature.getsStatus());
                        }
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: java java-8 java-stream flatmap


    【解决方案1】:

    答案是使用flatMap:

    testResults.stream()
        .map(TestResult::getTestCapabilities).flatMap(Collection::stream)
        .map(TestCapability::getTestSuites).flatMap(Collection::stream)
        .map(TestSuite::getTestCases).flatMap(Collection::stream)
        .forEach(testCase -> {
            featureDetails.stream()
                .filter(feature -> testCase.getTags().contains(feature.getsNumber()))
                .map(Feature::getsId)
                .forEach(testResultsAuditResponse::setsId);
        });
    

    【讨论】:

    • 你在testResults中错过了.stream()。
    • 如何设置多个值?像 testResultsAuditResponse.setsId(feature.getsId()); testResultsAuditResponse.setsNumber(feature.getsNumber()); testResultsAuditResponse.setsName(feature.getsName()); testResultsAuditResponse.setsStatus(feature.getsStatus());
    • @Johannes Kuhn 我已更新问题以在特征对象中设置多个值。我能够使用您的第一个解决方案来处理它,但不确定如何使用改进的解决方案。可以看看吗?
    • 我建议你使用一个辅助函数来做到这一点。内联也可以工作,但尽量保持你的 lambdas 简短。
    猜你喜欢
    • 2018-11-24
    • 2017-04-02
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多