【问题标题】:How to filter Array of Map with multiple value using Guava如何使用 Guava 过滤具有多个值的地图数组
【发布时间】:2017-10-16 07:42:41
【问题描述】:

我有一个包含 Map 的数组。而且我想使用地图对象内的一些(多个)键和值来过滤我的数组。例如,WHERE ID > 1 AND Name "cc" (key > 1, Name"cc")。

我如何在 Java 中做到这一点? 我已经导入了具有 Collections2 的 Guava 库来过滤数组。 但是,我没有找到任何在数组中过滤 Map 对象的示例。

这是我的一些示例代码:

List<Map<String, Object>> baseList = new ArrayList<>();

            Map<String, Object> map1 = new HashMap<>();
            map1.put("ID", 1);
            map1.put("Name", "aa");
            baseList.add(map1);

            Map<String, Object> map2 = new HashMap<>();
            map2.put("ID", 2);
            map2.put("Name", "bb");
            baseList.add(map2);

            Map<String, Object> map3 = new HashMap<>();
            map3.put("ID", 3);
            map3.put("Name", "cc");
            baseList.add(map3);

            List<Map<String, Object>> filteredList = new ArrayList<>();

            filteredList = Collections2.filter() ???

我想用一种ID &gt;= 1 AND NAME&lt;&gt;"cc" 进行过滤,这将产生包含 Map 对象的数组,如下所示:[{ID=1,Name="aa"}, {ID=2,Name="bb"}]

有人可以帮忙吗?

【问题讨论】:

    标签: java android guava android-guava


    【解决方案1】:

    我不知道你需要 Guava 做什么。我会通过以下方式做到这一点:

    List<Map<String, Object>> filteredList = baseList.stream()
        .filter(map -> map.entrySet().stream()
                      .anyMatch(e -> e.getKey().equals(1L) && e.getValue().equals("cc")))
        .collect(Collectors.toList());
    

    【讨论】:

    • 我知道 Java 8 lambda 过滤,但这不是我需要的。但是,感谢您的帮助。
    【解决方案2】:

    您使用 Java 8 吗?你可以这样做:

    List<Map<String, Object>> filteredList = maps.stream()
        .filter(map -> (Integer) map.get("ID") >= 1 && !"cc".equals(map.get("Name")))
        .collect(Collectors.toList());
    

    拥有过滤地图的新列表。

    如果你想收集 view 使用 Guava goodies(或没有 Java 8),你应该使用 Collections2.filter:

    Collection<Map<String, Object>> filteredList = Collections2.filter(
        maps, new Predicate<Map<String, Object>>() {
          @Override
          public boolean apply(@Nullable Map<String, Object> map) {
            return (Integer) map.get("ID") >= 1 && !"cc".equals(map.get("Name"));
          }
        });
    

    没有Lists.filter,见IdeaGraveyard for explanation,因此只提供了Collection接口。

    您真的需要地图列表而不是 Map&lt;Integer, String&gt;(或者可能是 Map&lt;Integer, YourDomainObject&gt;)吗?然后你可以这样做:

    final Map<Integer, String> map = ImmutableMap.of(
        1, "aa",
        2, "bb",
        3, "cc");
    final Map<Integer, String> filteredMap = Maps.filterEntries(map,
        e -> e.getKey() >= 1 && !"cc".equals(e.getValue()));
    

    【讨论】:

    • 您对 Collections2.filter() 的解释很好地解释了我。谢谢
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2022-07-08
    • 2023-01-10
    • 1970-01-01
    • 2019-08-09
    • 2014-02-14
    • 2019-12-29
    相关资源
    最近更新 更多