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.
3 Réponses :
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/
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
Map
(A Diffusez
), puis utilisez anyMatch
pour déterminer si l'un des étudiants
porte le nom «Andy»
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"));
Je recommanderais d'utiliser un objet
Student
au lieu d'une carte imbriquée.