基于嵌套的静态类属性的Collectors.groupingBy

时间:2019-01-16 22:29:02

标签: java java-8 java-stream

我有一个College类,带有嵌套的静态类Dept

大学

class College {
private String collegeName;

private Dept dept;

public Dept getDept() {
    return dept;
}

public void setDept(Dept dept) {
    this.dept = dept;
}

public String getCollegeName() {
    return CollegeName;
}

public void setCollegeName(String collegeName) {
    CollegeName = collegeName;
}

public static class Dept {

    private String deptName;

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
        }

    }

 }

我有list个对象中的College个,并试图基于groupingBydeptName i,e (Map<String>, List<College>),但是到目前为止还没有运气,它给出了编译错误消息

List<College> list = new ArrayList<College>();
list.stream().collect(Collectors.groupingBy(College.Dept::getDeptName));

编译错误

The method collect(Collector<? super College,A,R>) in the type Stream<College> is not applicable for the arguments (Collector<College.Dept,capture#1-of ?,Map<String,List<College.Dept>>>)

2 个答案:

答案 0 :(得分:4)

College.Dept::getName

Function<College.Dept, String>。它不接受College作为输入。

使用lambda构造Function<College, String>

groupingBy(c -> c.getDept().getName())

答案 1 :(得分:2)

您可以尝试以下方法:

Map<String, List<College>> map = 
         list.stream()
             .collect(groupingBy(college -> college.getDept().getDeptName()));

更新

尽管我认为这两个观察点值得一提,但这两个观察点可能不合时宜

  1. 类别属性CollegeName的标识符是否故意大写?我强烈建议您在所有代码中使用相同的编码样式。

  2. 看起来您需要重新考虑数据层次结构(即使这只是教程任务)。 CollegeDept之间的关系不应为one-to-one,而应为one-to-many