我写了这段代码:
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,而是工作正常。
答案 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()