2017-10-16 3 views
1

J'ai un tableau contenant la carte. Et je veux filtrer mon tableau en utilisant une clé (multiple) et une valeur à l'intérieur de l'objet de la carte. Par exemple, WHERE ID> 1 AND Nom <> "cc" (clé> 1, nom > "cc").Comment filtrer Tableau de Carte avec plusieurs valeurs en utilisant Goyave

Comment puis-je faire cela en Java? J'ai importé les bibliothèques Guava qui ont Collections2 pour filtrer le tableau. Mais, je n'ai trouvé aucun exemple de filtrage de l'objet Map dans le tableau.

voici certains de mes codes par exemple:

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

Je veux filtrer avec une sorte de ID >= 1 AND NAME<>"cc" qui sera obtenu tableau contenant l'objet de la carte comme ceci: [{ID=1,Name="aa"}, {ID=2,Name="bb"}]

Tout le monde peut aider?

Répondre

0

Utilisez-vous Java 8? Vous pouvez faire:

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

pour avoir une nouvelle liste avec les cartes filtrées.

Si vous voulez collection vue à l'aide de goodies Goyave (ou pas Java 8), vous devez utiliser 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")); 
     } 
    }); 

il n'y a pas Lists.filter, voir IdeaGraveyard for explanation, donc que Collection interface est fournie.

Avez-vous vraiment besoin de la liste des cartes au lieu de Map<Integer, String> (ou peut-être Map<Integer, YourDomainObject>)? Alors vous pourriez faire:

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

Votre explication sur Collections2.filter() m'a bien expliqué. Je vous remercie –

3

Je n'ai aucune idée de ce que vous avez besoin de Guava pour. Je le ferais de la façon suivante:

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

Ressemble à la bonne réponse. –

+0

Je connais le filtrage lambda Java 8, mais ce n'est pas celui dont j'ai besoin. Mais, merci pour votre aide. –