Java потоковый вопрос, mapToInt и средний метод - PullRequest
4 голосов
/ 05 апреля 2020

Почему я могу вызвать average() метод для одного, но не для другого? Разве они не должны быть эквивалентными?

пример 1 - работает

List<String> stringList = new ArrayList<>();
    stringList.add("2");
    stringList.add("4");
    stringList.add("6");
// String array ("2","4", "6"
averageValue = stringList.stream()
                .mapToInt(s -> Integer.valueOf(s))
                .average()
                .getAsDouble();   

пример 2 - не компилируется (удален вызов mapToInt, потому что уже передается поток Integer)

List<Integer> IntegerList = new ArrayList<>();
        IntegerList.add(2);
        IntegerList.add(4);
        IntegerList.add(6);

averageValue = IntegerList.stream()
                    .average()
                    .getAsDouble();  

Вопрос, зачем мне вызывать метод mapToInt, когда я уже передаю ему поток целых чисел?

Ответы [ 2 ]

9 голосов
/ 05 апреля 2020

Существует два разных типа: Stream<Integer> и IntStream.

Java. У дженериков не может быть методов, которые применяются только к . Некоторые дженерики. Например, он не может иметь Stream<Integer>.average(), а не и иметь Stream<PersonName>.average(), даже если имя обычного человека не имеет смысла.

Следовательно, Stream имеет mapToInt метод, который преобразует его в IntStream, который затем предоставляет метод average().

3 голосов
/ 05 апреля 2020

IntStream предоставляет метод average(), поэтому для его использования необходимо преобразовать Stream<Integer> в IntStream с использованием метода mapToInt.

...