2017-10-16 34 views
1

我有一個包含地圖的數組。我想用地圖對象中的一些(多個)鍵和值來過濾我的數組。例如,WHERE ID> 1和名稱<>「cc」(鍵> 1,名稱<>「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"}]

任何人都可以幫助嗎?

回答

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()); 

要有過濾的地圖的新列表。

如果你想收集視圖利用番石榴的好東西(或沒有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())); 
+0

您對Collections2.filter()的解釋對我很好解釋。謝謝 –

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()); 
+0

看起來像正確的答案。 –

+0

我知道Java 8 lambda過濾,但這不是我需要的。但是,感謝您的幫助。 –