【问题标题】:Verify that all key/value pairs in a Map are present in another Map验证 Map 中的所有键/值对是否存在于另一个 Map 中
【发布时间】:2015-10-08 19:26:45
【问题描述】:

我有一个包含地图的对象列表。 对象看起来像这样:

public class SwiftObject {
    private Map<String, String> metadata;
    ...
}

我正在尝试根据存储在其 Map 中的键和值来过滤我的对象。
我的过滤条件包含在另一个地图中。
我想过滤并保留所有 Map 中包含的所有键/值的对象。

这是我写的代码:

List<? extends SwiftObject> swiftObjects = documentStore.listAllObjects(container);
Map<String, String> searchMetadata = gssDocument.getMetadataMap();
List<SwiftObject> filteredSwiftObjects = swiftObjects.stream()
            .filter(swiftObject ->
                    searchMetadata.entrySet().stream()
                    .allMatch(entry -> entry.getValue().equals(swiftObject.getMetadata().get(entry.getKey())))
                    )
            .collect(Collectors.ToList());

这是正确的方法还是可以重构/优化?
searchMetadata 映射不包含空值

【问题讨论】:

    标签: java lambda java-8


    【解决方案1】:

    使用Map.equals(Map other) 检查两个映射是否包含相同的映射。如果您只需要检查一张地图是否是另一张地图的子集,请使用map.@987654322@().containsAll(other.entrySet())

    【讨论】:

    • 谢谢@h22,我会用你的回答编辑我的问题
    • @bobuns 请不要,这会使最初的问题消失,答案将不再有效。
    • @bobuns:不要将答案复制到您的问题中。接受的答案将始终显示在您的问题下方。通过接受答案,您已经在告诉您这是一个适合您的解决方案。
    • OT:我发现这个问题正在寻找使用 AssertJ 库在单元测试中包含测试地图。该库提供containsAllEntriesOf 方法。因此,要断言映射至少包含所需的预期条目,请使用 assertThat(actual).containsAllEntriesOf(expected)
    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 2014-10-01
    • 2019-04-26
    • 1970-01-01
    • 2019-12-02
    • 2021-10-01
    相关资源
    最近更新 更多