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.
étudiantdoit êtreétudiant.