Java Collectors.groupingBy не может найти ошибку - PullRequest
0 голосов
/ 12 октября 2018

Компилятор выдает здесь ошибку нестатического метода, я уже знаю, что это не означает, что это должно быть проблемой, но я действительно не могу найти ничего другого, тем более что у меня такой же метод в другом классе, простодля прохода играет все работает.

public Map<Integer, Map<Integer, Double>> setup(ArrayList<RunPlay> play){
Map<Integer, Map<Integer,Double>> map =
         plays.stream()
                    .collect(
                            Collectors.groupingBy(RunPlay::getYardline, Collectors.groupingBy(RunPlay::getDown, Collectors.averagingDouble(PassPlay::getPoints)))
                    );
    return map;

вот класс RunPlay:

public class RunPlay {

private int yardline;
private int down;
private int togo;
private int gained;
private int td;

public RunPlay(int yardline, int down, int togo, int gained, int td){

    this.down=down;
    this.gained=gained;
    this.td=td;
    this.togo=togo;
    this.yardline=yardline;

}

public double getPoints(){
    double result=0;
    result+=((getGained()*0.1)+(td*6));
    return result;
}

public int getYardline() {
    return yardline;
}

public int getGained() { return gained; }

public int getDown() { return down; }

public int getTd() {
    return td;
}

public int getTogo() {
    return togo;
}
}

1 Ответ

0 голосов
/ 13 октября 2018

Элементами вашего stream конвейера являются RunPlay экземпляры.Поэтому, когда вы вызываете RunPlay::getYardline, соответствующий метод вызывается для переданного в объекте, который в вашем случае является экземпляром RunPlay.Но как вы можете вызвать PassPlay::getPoints, что невозможно в этом контексте, используя ссылку на метод.Поэтому, если вам нужно сделать это, вы должны использовать лямбда-выражение, например, предполагая, что метод является методом экземпляра,

Map<Integer, Map<Integer, Double>> map = plays.stream()
    .collect(Collectors.groupingBy(RunPlay::getYardline, Collectors.groupingBy(RunPlay::getDown,
        Collectors.averagingDouble(ignored -> new PassPlay().getPoints()))));

Однако вы можете использовать ту же ссылку на метод, которую вы использовали выше в этом контексте, чтодопустимо.

Function<PassPlay, Double> toDoubleFn = PassPlay::getPoints;

Таким образом, метод getPoints будет вызван в переданном экземпляре.

...