首页 > 解决方案 > 为什么 mapToInt 不能与 collect(toList()) 一起使用?

问题描述

我写了这段代码:

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,它可以正常工作。

标签: javajava-8java-stream

解决方案


mapToInt产生一个IntStream,它没有collect采用单个Collector参数的方法。

由于最终结果是 a List<Integer>,因此您不必将 the 转换Stream为 a IntStream

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

如果要将 的元素收集到原始数组,则将转换Stream为 aIntStream是有意义的:Stream

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

如果你想转换为anIntStream并且仍然使用该collect方法,你可以写如下(不太推荐):

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

推荐阅读