Не удается определить тип возвращаемого значения Collectors.groupinBy - PullRequest
1 голос
/ 09 июля 2019

Подобные проблемы уже были решены ранее, но я так и не смог выяснить, в чем проблема с моим методом группировки и усреднения.

Я пробовал несколько комбинаций возвращаемых значений, таких как Map<Long, Double>, Map<Long, List<Double>, Map<Long, Map<Long, Double>>, Map<Long, Map<Long, List<Double>>>, и ни одна из них не исправляет ошибку, которую IntelliJ выдает мне: «Нестатический метод не может быть указан изстатический контекст ».На данный момент я чувствую, что просто слепо угадываю.Так может кто-нибудь дать мне некоторое представление о том, как определить правильный тип возвращаемого значения?Спасибо!

Метод:

public static <T> Map<Long, Double> findAverageInEpochGroup(List<Answer> values, ToIntFunction<? super T> fn) {
    return values.stream()
            .collect(Collectors.groupingBy(Answer::getCreation_date, Collectors.averagingInt(fn)));
}

Класс ответа:

@Getter
@Setter
@Builder
public class Answer {
    private int view_count;
    private int answer_count;
    private int score;
    private long creation_date;
}

1 Ответ

5 голосов
/ 09 июля 2019

Ошибка компилятора, которую я получаю, отличается от того, что вызов метода collect не применим для аргументов.

Ваш тип возврата Map<Long, Double> правильный, но что не так, это ваш ToIntFunction<? super T>. Когда вы делаете этот метод универсальным, вы говорите, что вызывающая сторона контролирует T; вызывающая сторона может предоставить аргумент типа, например:

yourInstance.<FooBar>findAverageInEpochGroupOrig(answers, Answer::getAnswer_count);

Однако этот метод не должен быть универсальным. Просто возьмите ToIntFunction<? super Answer> для работы с Answer для значений карты. Это компилирует:

public static Map<Long, Double> findAverageInEpochGroup(List<Answer> values, ToIntFunction<? super Answer> fn) {
    return values.stream()
            .collect(Collectors.groupingBy(Answer::getCreation_date, Collectors.averagingInt(fn)));
}

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

...