1
votes

Recherche d'une valeur dans une carte imbriquée dans Java8

J'essaie de parcourir une carte imbriquée pour une valeur spécifique en utilisant java8. Exemple: La carte est un

classStudentGrp.forEach((sid,stu)->stu.forEach((sAttr,val)->val.equals("Andy")));

et certains des enregistrements sont comme

StudentId1:
StudentName:Andy
StudentAge:12
StudentAddress:xxxx

StudentId1:
StudentName:Anna
StudentAge:11
StudentAddress:yyyy

et ainsi de suite.

Je suis en regardant quelque chose comme

Map<Integer, Map<String,String>> classStudentGrp;

et je veux soit retourner un booléen (vrai), soit définir une variable si 'Andy' est trouvé. Je connais l'approche traditionnelle utilisant des clés d'entrée et des valeurs, mais j'essaie de le faire en lambda.


1 commentaires

Je recommanderais d'utiliser un objet Student au lieu d'une carte imbriquée.


3 Réponses :


0
votes

reportez-vous à l'exemple ci-dessous

List<String> result = lines.stream()                // convert list to stream
  .filter(line -> "mkyong".equals(line))            // we dont like mkyong
  .collect(Collectors.toList()); 

provenant de https://www.mkyong.com/java8/java-8-streams-filter-examples/


0 commentaires

2
votes

Je vous recommande fortement de créer une classe Student au lieu d'avoir simplement une String au format:

boolean value = classStudentGrp.values().stream()
                                        .anyMatch(e -> e.getName().equals("Andy"));

Java est un objet Langage orienté, et il est préférable de l'utiliser comme tel. Vous pouvez créer une classe comme:

class Student {
   private String name;
   private String id;
   private int age;
   private String address;  
   //Getters and setters
   //Appropriate constructors
}

Ensuite, vous pouvez faire:

StudentId1:
StudentName:Andy
StudentAge:12
StudentAddress:xxxx

Ce qui prendra un flux des valeurs de classStudentGrp (La Map ), prenez les valeurs de cette Map (A Diffusez ), puis utilisez anyMatch pour déterminer si l'un des étudiants porte le nom «Andy»


0 commentaires

2
votes

Vous pouvez le tester avec ceci:

boolean contains = classStudentGrp.stream().anyMatch(s -> "Andy".equals(s.getName()))

Mais vous devriez utiliser un objet Student comme celui-ci:

public class Student {
    private String name;
    private int age;
    // ...
}

Avec un Listez que vous pouvez utiliser simplement ceci:

boolean contains = classStudentGrp.values().stream()
        .anyMatch(m -> m.containsValue("Andy"));


0 commentaires