Java对anyMatch使用多个谓词

时间:2018-10-01 07:16:35

标签: java java-stream

我有List的{​​{1}},即HashMap。我要检查此列表中是否存在某些键值。

例如:

List<Map<String, Object>> result

我希望我正在使用 anyMatch

的地图列表中至少包含一个上表条目
Name      Count 
Marvel    10
DC         0  

如何使用多个谓词?我可以有1000个Assert.assertTrue( result.stream().anyMatch( ag -> ( "Marvel".equals(ag.get("Name")) && 10==(int)ag.get("Count")) )); 的列表,我只想检查列表中是否有两个哈希映射包含这两个条目。

1 个答案:

答案 0 :(得分:2)

您的数据结构似乎一开始是错误的。一个List<Map<String, Object>>,其中每个映射表示一行,并且只有一个键和一个值?您只需要一个Map<String, Integer>。字符串是名称,整数是计数。请记住给它起一个有意义的名称,例如comicUniverseToSuperheroFrequency

话虽如此,Predicate has an and method可用于将条件链接在一起。它可能看起来像这样:

public static void main(String[] args)
{
    Map<String, Integer> comicUniverseToSuperheroFrequency = /*something*/;

    boolean isMarvelCountTen = comicUniverseToSuperheroFrequency.entrySet().stream()
        .anyMatch(row -> isMarvel().and(isTen()).test(row));
}

private static Predicate<Map.Entry<String, Integer>> isMarvel()
{
    return row -> "Marvel".equals(row.getKey());
}

private static Predicate<Map.Entry<String, Integer>> isTen()
{
    return row -> row.getValue() == 10;
}