java - 为什么mapToInt不能与collect(toList())一起使用?

标签 java java-8 java-stream

我写了这段代码:

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)

这里发生了什么?为什么有限制?如果你使用 map 。而不是mapToInt,它工作得很好。

最佳答案

mapToInt产生 IntStream ,其中没有 collect采取单一的方法Collector论证。

由于最终结果是 List<Integer> ,您不必转换 StreamIntStream :

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

转变StreamIntStream如果您想收集 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);

关于java - 为什么mapToInt不能与collect(toList())一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552258/

相关文章:

java - 此 URL 不支持 HTTP 方法 GET WL 12.2.1 上的 Rest-full WS

java - 使用 XStream 创建不同对象的列表

java-8 - Java 8 groupingby 返回多个字段

Java 8 使用对象子级的字段将 List<Object> 转换为 Map<K,V>?

java - 如何在单击按钮时从 JTextField 中删除 DocumentFilter 文本

java - 从写入文件的行中获取特定字符串

Java 8 从映射中的匹配值中提取所有键

java 8 获取最大出现次数相等的元素

java - 如何通过减少下游进行分组收集?

java - 为什么上下文在这个 Java 8 流示例中是静态的?