Почему mapToInt нельзя использовать с collect (toList ())? - PullRequest
0 голосов
/ 27 мая 2018

Я написал этот код:

import java.util.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String... args) {
        List<String> a = Arrays.asList("One", "Two", "three");
        List<Integer> lengths = a.stream().mapToInt(String::length).collect(Collectors.toList());

    }
}

, но он не хочет компилировать, говоря:

Error:(8, 68) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
  required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
  found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
  reason: cannot infer type-variable(s) R
    (actual and formal argument lists differ in length)

Что здесь происходит?Почему ограничение?Если вы используете карту.Вместо mapToInt он работает нормально.

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

После .mapToInt вы получили IntStream.

Определение collect для этого потока:

<R> R collect(Supplier<R> supplier,
              ObjIntConsumer<R> accumulator,
              BiConsumer<R, R> combiner);

Следовательно, вы не можете просто сделать toList() здесь.

0 голосов
/ 27 мая 2018

mapToInt создает IntStream, у которого нет метода collect, принимающего один аргумент Collector.

Поскольку конечным результатом является List<Integer>, у вас нетпреобразование Stream в IntStream:

List<Integer> lengths = a.stream().map(String::length).collect(Collectors.toList());

Преобразование Stream в IntStream будет иметь смысл, если вы хотите собрать элементы Stream в примитивный массив:

int[] lengths = a.stream().mapToInt(String::length).toArray();

Если вы хотите преобразовать в IntStream и все еще использовать метод collect, вы можете написать следующее (что менее рекомендуется):

List<Integer> lengths = 
    a.stream()
     .mapToInt(String::length)
     .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
...