2016-08-05 88 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

相关问题