Java 8 Java8流API:映射、分组到不同的对象

Java 8 Java8流API:映射、分组到不同的对象,java-8,java-stream,Java 8,Java Stream,我对Java8相当陌生。我需要将普通对象列表转换为按特定条件分组的对象,并将其显示在UI上 地图的关键应该是“从日期到日期”和 学生列表应与此组合相关联 此外,“ClassOfMSWAN”对象需要转换为“Student”对象并保存到列表中 Java1.7的代码已经编写完毕,需要 可以转换为Java1.8 请帮帮我 public class ClassOfMsSwan { private String fromDate; private String toDate; private Stri

我对Java8相当陌生。我需要将普通对象列表转换为按特定条件分组的对象,并将其显示在UI上

  • 地图的关键应该是“从日期到日期”和 学生列表应与此组合相关联
  • 此外,“ClassOfMSWAN”对象需要转换为“Student”对象并保存到列表中
  • Java1.7的代码已经编写完毕,需要 可以转换为Java1.8
请帮帮我

public class ClassOfMsSwan {

private String fromDate;
private String toDate;
private String studentName;
private String subject;
private String marks;

public ClassOfMsSwan(String fromDate, String toDate, String studentName, String subject, String marks) {
    super();
    this.fromDate = fromDate;
    this.toDate = toDate;
    this.studentName = studentName;
    this.subject = subject;
    this.marks = marks;
}
// setters and getters


public class Student {

private String name;
private String subject;
private String marks;
public Student(String name, String subject, String marks) {
    this.marks = marks;
    this.subject = subject;
    this.name = name;
}   
// setters and getters




List<ClassOfMsSwan> classes = new ArrayList<>();

    ClassOfMsSwan classOfMsSwan1 = new ClassOfMsSwan("06/01/2016", "05/31/2017", "David", "Physics", "98");
    ClassOfMsSwan classOfMsSwan2 = new ClassOfMsSwan("06/01/2016", "05/31/2017", "Jane", "Botany", "85");
    ClassOfMsSwan classOfMsSwan3 = new ClassOfMsSwan("06/01/2016", "05/31/2017", "Mathew", "Algebra", "76");

    ClassOfMsSwan classOfMsSwan4 = new ClassOfMsSwan("06/01/2017", "05/31/2018", "David", "Geometry", "94");
    ClassOfMsSwan classOfMsSwan5 = new ClassOfMsSwan("06/01/2017", "05/31/2018", "Jane", "Organic Chemistry", "92");
    ClassOfMsSwan classOfMsSwan6 = new ClassOfMsSwan("06/01/2017", "05/31/2018", "Mathew", "Botany", "100");

    ClassOfMsSwan classOfMsSwan7 = new ClassOfMsSwan("06/01/2018", "05/31/2019", "Mathew", "Geometry", "86");
    ClassOfMsSwan classOfMsSwan8 = new ClassOfMsSwan("06/01/2018", "05/31/2019", "Jane", "Algebra", "84");

    classes.add(classOfMsSwan1);
    classes.add(classOfMsSwan2);
    classes.add(classOfMsSwan3);
    classes.add(classOfMsSwan4);
    classes.add(classOfMsSwan5);
    classes.add(classOfMsSwan6);
    classes.add(classOfMsSwan7);
    classes.add(classOfMsSwan8);

    // JDK1.7
    Map<String, List<Student>> dateStudentMap = new HashMap<>();
    for(ClassOfMsSwan classOfMsSwan : classes) {
        List<Student> students = dateStudentMap.get(classOfMsSwan.getFromDate() + "-" + classOfMsSwan.getToDate());
        if(CollectionUtils.isEmpty(students)) {
            students = new ArrayList<>();
            dateStudentMap.put(classOfMsSwan.getFromDate() + "-" + classOfMsSwan.getToDate(), students);
        }
        students.add(new Student(classOfMsSwan.getStudentName(), classOfMsSwan.getSubject(), classOfMsSwan.getMarks()));
    }


Desired output
   {06/01/2016-05/31/2017=[Student [name=David, subject=Physics, marks=98], Student [name=Jane, subject=Botany, marks=85], Student [name=Mathew, subject=Algebra, marks=76]], 06/01/2017-05/31/2018=[Student [name=David, subject=Geometry, marks=94], Student [name=Jane, subject=Organic Chemistry, marks=92], Student [name=Mathew, subject=Botany, marks=100]], 06/01/2018-05/31/2019=[Student [name=Mathew, subject=Geometry, marks=86], Student [name=Jane, subject=Algebra, marks=84]]}
MSWAN的公共类{
私有字符串fromDate;
私有字符串toDate;
私有字符串studentName;
私有字符串主题;
私有字符串标记;
MSWAN的公共类(字符串fromDate、字符串toDate、字符串studentName、字符串subject、字符串标记){
超级();
this.fromDate=fromDate;
this.toDate=toDate;
this.studentName=studentName;
this.subject=主语;
这个。标记=标记;
}
//二传手和接球手
公立班学生{
私有字符串名称;
私有字符串主题;
私有字符串标记;
公立学生(字符串名称、字符串主题、字符串标记){
这个。标记=标记;
this.subject=主语;
this.name=名称;
}   
//二传手和接球手
列表类=新的ArrayList();
ClassOfMSWAN ClassOfMSWAN1=MSWAN的新类别(“2016年1月6日”、“2017年31月5日”、“大卫”、“物理学”、“98”);
ClassOfMSWAN ClassOfMSWAN2=MSWAN的新类别(“2016年1月6日”、“2017年31月5日”、“简”、“植物学”、“85”);
ClassOfMSWAN ClassOfMSWAN3=MSWAN的新类别(“2016年1月6日”、“2017年31月5日”、“马修”、“代数”、“76”);
ClassOfMSWAN ClassOfMSWAN4=MSWAN的新类别(“2017年1月6日”、“2018年3月31日”、“大卫”、“几何”、“94”);
ClassOfMSWAN ClassOfMSWAN 5=MSWAN的新类别(“2017年1月6日”、“2018年3月31日”、“Jane”、“有机化学”、“92”);
ClassOfMSWAN ClassOfMSWAN6=MSWAN的新类别(“2017年1月6日”、“2018年3月31日”、“马修”、“植物学”、“100”);
ClassOfMSWAN ClassOfMSWAN7=MSWAN的新类别(“2018年1月6日”、“2019年3月31日”、“马修”、“几何”、“86”);
ClassOfMSWAN ClassOfMSWAN8=MSWAN的新类别(“2018年1月6日”、“2019年3月31日”、“简”、“代数”、“84”);
添加(ClassOfMSWAN1);
添加(ClassOfMSWAN2);
添加(ClassOfMSWAN3);
添加(ClassOfMSWAN4);
添加(ClassOfMSWAN5);
添加(ClassOfMSWAN6);
添加(ClassOfMSWAN7);
添加(ClassOfMSWAN8);
//JDK1.7
Map dateStudentMap=newhashmap();
for(ClassOfMSWAN ClassOfMSWAN:类){
List students=dateStudentMap.get(classOfMSWAN.getFromDate()+“-”+classOfMSWAN.getToDate());
if(CollectionUtils.isEmpty(学生)){
学生=新数组列表();
dateStudentMap.put(ClassOfMSWAN.getFromDate()+“-”+ClassOfMSWAN.getToDate(),学生);
}
添加(新学生(classofmswan.getStudentName(),classofmswan.getSubject(),classofmswan.getMarks());
}
期望输出
{06/01/2016-05/31/2017=[学生[姓名=大卫,科目=物理,分数=98],学生[姓名=简,科目=植物学,分数=85],学生[姓名=马修,科目=代数,分数=76]],06/01/2017-05/31/2018=[学生[姓名=大卫,科目=几何,分数=94],学生[姓名=简,科目=有机化学,分数=92],学生[姓名=马修,科目=植物学,分数=100]],2018年1月6日-2019年5月31日=[学生[姓名=马修,科目=几何,分数=86],学生[姓名=简,科目=代数,分数=84]]

您可以通过如下方式使用Java 8 API实现此目的:

Map<String, Set<Student>> dateStudentMap = classes.stream().map(e ->  
                new Entry(e.getFromDate() + "-" + e.getToDate(),
                        new Student(e.getStudentName(), e.getSubject(), e.getMarks())
            ))
    .collect(groupingBy(Entry::getKey, TreeMap::new,
            mapping(Entry::getValue, toSet())));
希望有帮助

编辑:

根据霍尔格的评论(要好得多):

Map dateStudentMap8=classes.stream()
.收集(分组方式(e->
e、 getFromDate()+“-”+e.getToDate(),
映射(e->
新学生(如getStudentName(),
e、 getSubject(),
e、 getMarks()),
toSet());

您可以通过如下方式使用Java 8 API实现此目的:

Map<String, Set<Student>> dateStudentMap = classes.stream().map(e ->  
                new Entry(e.getFromDate() + "-" + e.getToDate(),
                        new Student(e.getStudentName(), e.getSubject(), e.getMarks())
            ))
    .collect(groupingBy(Entry::getKey, TreeMap::new,
            mapping(Entry::getValue, toSet())));
希望有帮助

编辑:

根据霍尔格的评论(要好得多):

Map dateStudentMap8=classes.stream()
.收集(分组方式(e->
e、 getFromDate()+“-”+e.getToDate(),
映射(e->
新学生(如getStudentName(),
e、 getSubject(),
e、 getMarks()),
toSet());

看一看。它还包含一些示例和方便的方法让你开始。看一看。它还包含一些示例和方便的方法让你开始。不需要这个
条目
helper类。只需使用
classes.stream().collect(groupingBy(e->e.getFromDate()+“-”+e.getToDate(),映射(e->新学生(e.getStudentName()、e.getSubject()、e.getMarks()、toSet())
当OP明确使用了
HashMap
时,你为什么强制使用
TreeMap
也不清楚。你的评论是一个更好的答案,我根据它编辑了我的评论,谢谢!谢谢!这正是我想要的!不需要这个
条目
助手类。只需使用
类。stream().collect(分组方式(e->e.getFromDate()+“-”+e.getToDate(),映射(e->new Student(e.getStudentName(),e.getSubject(),e.getMarks()),toSet()))
当OP明确使用了
HashMap
时,你为什么强制使用
树形图
…你的评论是一个更好的答案,我根据它编辑了我的评论,谢谢!谢谢!这正是我想要的!
    Map<String, Set<Student>> dateStudentMap8 = classes.stream()
            .collect(groupingBy(e -> 
                        e.getFromDate() + "-" + e.getToDate(),
                        mapping(e -> 
                            new Student(e.getStudentName(), 
                                        e.getSubject(), 
                                        e.getMarks()), 
                            toSet())));