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

class Vocational{ 
    String grade; 
    String vocationalSubject; 
} 

我想用java 8個lambda表達式來List<Student>轉換爲Map<Vocational,List<Student>>轉換列表<A>到地圖<B,List<A>>

如果我有職業爲學生的一員,那麼我可以這樣做:
students.stream().collect(Collectors.groupingBy(Student::getVocational))

由於我沒有VocationalStudent成員做什麼,我需要創建使用Vocational::new它,但我不確定如何在Vocational中設置這兩個字段(gradevocationalSubjectStudent

試圖用Java 8個Lambda表達式

+1

好吧,你卡在什麼?你讀過Stream教程了嗎? https://docs.oracle.com/javase/tutorial/collections/streams/您還可以提供一個示例輸入/輸出嗎? – Tunaki

+0

我指的是[這個例子](https://www.mkyong.com/java8/java-8-collectors-groupingby-and-mapping-example/)。如果我職業是學生的成員,那麼我可以這樣做: 'students.stream()。collect(Collectors.groupingBy(Student :: getVocational))' 但是當它不是時,我需要創建該類的對象,然後用等級和職業主題填充它。 不知道該怎麼做 – Akshay

回答

3

假定你已經實現equalshashCode方法正確的話,那麼你就可以創建在groupingBy功能Vocational對象。

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

謝謝飛行。 這很有幫助! – Akshay

1

也許不是完美的做到這一點,但是這應該是接近你在找什麼。即使你沒有重寫「equals」方法,這也可以工作。

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

嗨Chirag, 感謝您的新方法和代碼片段。 – Akshay

相關問題