J'ai une liste et une carte comme ci-dessous:
newmap.entrySet().stream().filter(entry->entry.getKey().equals(student::getId)).collect(..collect here to list..);
Je compare comme ceci: si l'identifiant de la carte correspond à l'identifiant de la liste, ajoutez l'âge de la carte à l'âge de la liste.
J'ai essayé ceci jusqu'à présent, mais je ne suis pas en mesure de l'obtenir.
public class student { private String name; private String age; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } student(String id,String name,String age) { } } List<student> stulist = Arrays.asList(new student("1", "vishwa",null), new student("3", "Ravi",null), new student("2", "Ram",null)); Map<String,String> newmap = new HashMap() { { put("1","20"); put("2","30"); } };
4 Réponses :
Je pense que vous voulez dire List
mais il renvoie null, null, null
Je commence à écrire la même chose ... Tu l'as fait plus vite que moi - vote positif :)
stulist = stulist.stream().map(instance -> { student studentInstance = instance; studentInstance.setAge(newMap.getOrDefault(studentInstance.getId(),"<default age>")); return studentInstance; }).collect(Collectors.toList()); ; ps: Use proper naming conventions. Change the class name student to Student.
Il a demandé une solution java 8, je suppose qu'il veut diffuser la solution
Essayez de donner du sol en java 8
Je l'ai changé en java 8.
Voici la solution, en supposant que je pose la bonne question:
import java.util.*; import java.util.stream.*; public class Answer { public static void main(String[] args) { List<Student> studentsWithoutAge = Arrays.asList( new Student("1", "Vishwa", null), new Student("3", "Ravi", null), new Student("2", "Ram", null) ); Map<String,String> ageById = new HashMap() {{ put("1","20"); put("2","30"); }}; List<Student> studentsWithAge = addAge(studentsWithoutAge, ageById); System.out.println("Students without age: " + studentsWithoutAge); System.out.println("Students with age: " + studentsWithAge); } static List<Student> addAge(List<Student> students, Map<String,String> ageById) { return students.stream() .map(student -> { String age = ageById.getOrDefault(student.getId(), null); return new Student(student.getId(), student.getName(), age); }) .collect(Collectors.toList()); } } class Student { private String name; private String age; private String id; Student(String id,String name,String age){ this.id = id; this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public String toString() { return String.format("Student: id = %s, name = %s, age = %s", this.id, this.name, this.age); } }
c'est mieux +1
Implémentez la classe Student en tant que commentaire @Zgurskyi, puis utilisez ceci sur main:
stulist.forEach(stu -> { stu.setAge(newmap.getOrDefault(stu.getId(), null)); });
très court et élégant.
D'où vient
student :: getId
? Vous aurez probablement besoin d'un mappage / filtrage à deux niveaux.Pouvez-vous ajouter une déclaration de carte?
Vous devez suivre les conventions de nommage Java: les noms de classe sont toujours écrits en PascalCase, ils doivent donc commencer par des majuscules. C'est à dire.
étudiant
doit êtreétudiant
.