使用Google集合映射相同的键和值

时间:2015-04-16 09:41:03

标签: java apache dictionary guava

我需要验证map(String to String)条目是否包含相同的键和值对(不区分大小写)。例如 -

("hello", "helLo") // is not a valid entry

我想知道Google集合的Iterable是否与Predicates结合起来可以轻松解决这个问题。

是的我可以为条目设置简单的迭代器来自己做,但想到任何事情已经出现了。

寻找内嵌Iterables.tryFind(fromToMaster, Predicates.isEqualEntry(IGNORE_CASE)).isPresent()

的内容

1 个答案:

答案 0 :(得分:3)

如果你想使用guava,你可以使用Maps utils,特别是filterEntries函数。

仅过滤键不等于值的条目(忽略大小写)的示例可能如下所示

Map<String, String> map = new HashMap<>();
map.put("hello", "helLo");
map.put("Foo", "bar");

Map<String, String> filtered = Maps.filterEntries(map, new Predicate<Map.Entry<String, String>>() {
    @Override
    public boolean apply(Map.Entry<String, String> input) {
        return !input.getKey().equalsIgnoreCase(input.getValue());
    }
});

System.out.println(filtered); // will print {Foo=bar}

然而,番石榴Predicates中没有默认的谓词。我知道你做了什么。

<强>增加:

如果您需要验证机制而不创建新地图,可以使用Iterablesany方法迭代地图的条目集。为了使条件更具可读性,我将谓词分配给您正在使用的类的变量或成员字段。

Predicate<Map.Entry<String, String>> keyEqualsValueIgnoreCase = new Predicate<Map.Entry<String, String>>() {
    @Override
    public boolean apply(Map.Entry<String, String> input) {
        return input.getKey().equalsIgnoreCase(input.getValue());
    }
};

if (Iterables.any(map.entrySet(), keyEqualsValueIgnoreCase)) {
    throw new IllegalStateException();
}

或者如果您需要该条目,可以使用Iterables#tryFind方法并使用返回的Optional

Optional<Map.Entry<String, String>> invalid = Iterables.tryFind(map.entrySet(), keyEqualsValueIgnoreCase);

if(invalid.isPresent()) {
    throw new IllegalStateException("Invalid entry " + invalid.get());
}