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

时间:2018-05-27 12:41:10

标签: 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)

这里发生了什么?为什么有限制?如果你使用地图。它没有mapToInt,而是工作正常。

3 个答案:

答案 0 :(得分:6)

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);

答案 1 :(得分:2)

.mapToInt IntStream后,您获得了collect

此流的<R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R, R> combiner); 定义为:

toList()

因此,你不能在这里做/* list.h */ typedef int list_element; // <-- need to generalize that struct list_node { list_element value; struct list_node* next; }; typedef struct list_node list_node; typedef struct list_node* list; extern list list_cons(list_element d, list l)

答案 2 :(得分:0)

有一种简单的方法可以将 IntStream 转换为 Stream。添加 Access to fetch at 'API URL' from origin 'WEBSITE URL' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 作为中间操作,您将能够使用 boxed() 作为终端操作。

collect()