1

我有一个包含地图的数组。而且我想使用地图对象内的一些(多个)键和值来过滤我的数组。例如,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 >= 1 AND NAME<>"cc"这将产生包含 Map 对象的数组,如下所示:[{ID=1,Name="aa"}, {ID=2,Name="bb"}]

任何人都可以帮忙吗?

4

2 回答 2

3

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

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());
于 2017-10-16T07:47:28.437 回答
0

你使用 Java 8 吗?你可以做:

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

获得带有过滤地图的新列表。

如果你想使用 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,因此只Collection提供接口。

你真的需要地图列表而不是Map<Integer, String>(或者也许Map<Integer, YourDomainObject>)?然后你可以这样做:

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()));
于 2017-10-17T06:46:51.850 回答