Вывод типа для потоков java8 - PullRequest
0 голосов
/ 27 апреля 2018

Я пробую потоки java8 в первый раз и имею немного морщинки с выводом синтаксиса по типу. Вот фрагмент:

Суть его:

Arrays.stream(stringArray).mapToInt(Integer::parseInt).collect(Collectors.toList()));

В результате:

Error:(56, 84) 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)

Вот более полный фрагмент:

try {
    br =  new BufferedReader(new FileReader(inputFile));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
String line = null;
while ((line = br.readLine()) != null) {
  list.add(Arrays.stream(line.split(","))
  .mapToInt(Integer::parseInt).collect(Collectors.toList()));
}

Я пробовал несколько похожих подходов / твиков, но еще не прорвался. Советы приветствуются.

1 Ответ

0 голосов
/ 27 апреля 2018

Это вовсе не вывод типов, а скорее то, что IntStream не имеет перегруженного collect метода, который принимает Collector. Вместо этого вы можете вызвать IntStream#boxed, чтобы сопоставить его с Stream<Integer>, а затем собрать его в List<Integer>:

Arrays.stream(stringArray)
      .mapToInt(Integer::parseInt)
      .boxed()
      .collect(Collectors.toList());

Еще более простым решением было бы сопоставить его с Stream<Integer> напрямую:

Arrays.stream(stringArray)
      .map(Integer::parseInt)
      .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...