2016-08-05 13 views
1
class Student{ 
    String name; 
    String grade; 
    String vocationalSubject; 
} 

class Vocational{ 
    String grade; 
    String vocationalSubject; 
} 

Ich möchte List<Student> zu Map<Vocational,List<Student>> konvertieren Java 8 lambdas verwenden.Convert Liste <A> auf Karte <B,List<A>>

Wenn ich Berufs als Mitglied der Studenten haben, dann kann ich tun:
students.stream().collect(Collectors.groupingBy(Student::getVocational))

Da ich nicht Vocational als Mitglied Student verfügen, muss ich es Vocational::new mit schaffen, aber ich bin nicht sicher, wie diese beiden Felder (grade und vocationalSubject) von Student in Vocational festgelegt werden.

Der Versuch, es zu tun Java 8 Lambdas mit

+1

Ok und was stecken Sie fest? Hast du das Stream-Tutorial gelesen? https://docs.oracle.com/javase/tutorial/collections/streams/ Können Sie auch eine Beispieleingabe/-ausgabe geben? – Tunaki

+0

Ich bezog mich auf [dieses Beispiel] (https://www.mkyong.com/java8/java-8-collectors-groupingby-and-mapping-example/). Wenn ich Beruf als Mitglied des Studenten habe, dann kann ich tun: 'students.stream(). Sammeln (Collectors.groupingBy (Student :: getVocational))' Aber wenn es nicht ist, muss ich erstellen Objekt dieser Klasse und bevölkern sie dann mit grade und professionalSubject. Nicht sicher, wie man das macht – Akshay

Antwort

3

Angenommen, Sie haben equals und hashCode Methoden korrekt umgesetzt, dann können Sie Vocational Objekte in der groupingBy Funktion erstellen.

Map<Vocational, List<Student>> mapping = students.stream() 
    .collect(
     Collectors.groupingBy(s -> new Vocational(s.getGrade(), s.getVocationalSubject())) 
    ); 
+0

Danke geflogen. Das ist hilfreich! – Akshay

1

nicht perfekt sein, aber dies sollte zu schließen sein, was Sie suchen. Dies funktioniert auch, wenn Sie die Methode "equals" nicht überschrieben haben.

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.stream.Collectors; 

class Student 
{ 

    String name; 
    String grade; 
    String vocationalSubject; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getGrade() { 
     return grade; 
    } 

    public void setGrade(String grade) { 
     this.grade = grade; 
    } 

    public String getVocationalSubject() { 
     return vocationalSubject; 
    } 

    public void setVocationalSubject(String vocationalSubject) { 
     this.vocationalSubject = vocationalSubject; 
    } 



    Student(String name,String grade,String vocSub) 
    { 
     this.name=name; 
     this.grade=grade; 
     this.vocationalSubject=vocSub; 
    } 

    @Override 
    public String toString() { 
     return "Student [name=" + name + ", grade=" + grade + ", vocationalSubject=" + vocationalSubject + "]"; 
    } 
} 

class Vocational 
{ 
    String grade; 
    String vocationalSubject; 

    public Vocational(String grade, String vocationalSubject) { 
     this.grade = grade; 
     this.vocationalSubject = vocationalSubject; 
    } 

    @Override 
    public String toString() { 
     return "Vocational [grade=" + grade + ", vocationalSubject=" + vocationalSubject + "]"; 
    } 

} 

public class Temp 
{ 

    public static void main(String args[]){ 
     Map<Vocational,List<Student>> map=new HashMap<Vocational,List<Student>>(); 
     List<Student> listStu=new ArrayList<Student>(); 
     listStu.add(new Student("Student1","100","aa")); 
     listStu.add(new Student("Student1","100","bb")); 
     listStu.add(new Student("Student2","50","aa")); 
     listStu.add(new Student("Student2","50","bb")); 
     listStu.add(new Student("Student3","100","aa")); 
     listStu.add(new Student("Student3","50","bb")); 
     listStu.add(new Student("Student4","50","aa")); 
     listStu.add(new Student("Student4","100","bb")); 

     listStu.stream().collect(Collectors.groupingBy(Student::getGrade,Collectors.groupingBy(Student::getVocationalSubject))) 
     .forEach((k,v)->v.forEach((x,y)->map.put(new Vocational(k, x), y))); 

     map.forEach((x,y)->System.out.println(x+":"+y)); 
    } 


} 
+0

Hallo Chirag, Danke für den neuen Ansatz und das Code-Snippet. – Akshay

Verwandte Themen