如何使用番石榴过滤具有多个值的地图数组
How to filter Array of Map with multiple value using Guava
我有一个包含地图的数组。我想使用地图对象内部的一些(多个)键和值来过滤我的数组。例如,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"}]
有人可以帮忙吗?
我不知道你需要 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());
你用Java8吗?你可以这样做:
List<Map<String, Object>> filteredList = maps.stream()
.filter(map -> (Integer) map.get("ID") >= 1 && !"cc".equals(map.get("Name")))
.collect(Collectors.toList());
拥有经过过滤的地图的新列表。
如果你想收集 view 使用 Guava 好东西(或没有 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<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()));
我有一个包含地图的数组。我想使用地图对象内部的一些(多个)键和值来过滤我的数组。例如,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"}]
有人可以帮忙吗?
我不知道你需要 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());
你用Java8吗?你可以这样做:
List<Map<String, Object>> filteredList = maps.stream()
.filter(map -> (Integer) map.get("ID") >= 1 && !"cc".equals(map.get("Name")))
.collect(Collectors.toList());
拥有经过过滤的地图的新列表。
如果你想收集 view 使用 Guava 好东西(或没有 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<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()));