Java8对Stream.collect()的一般用法
我首先要承认,擦除可能会使这变得不可能。以下是我试图做的,但不起作用:Java8对Stream.collect()的一般用法,java,generics,java-8,java-stream,Java,Generics,Java 8,Java Stream,我首先要承认,擦除可能会使这变得不可能。以下是我试图做的,但不起作用: import java.util.*; import java.util.function.*; import java.util.stream.*; public class Suppliers { public static <CollectionType, T> CollectionType<T> fill(CollectionType colltype, Supplier&l
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Suppliers {
public static <CollectionType, T> CollectionType<T>
fill(CollectionType colltype, Supplier<T> gen, int n) {
return Stream.generate(gen)
.limit(n)
.collect(colltype::new, colltype::add, colltype::addAll);
}
}
import java.util.*;
导入java.util.function.*;
导入java.util.stream.*;
公共类供应商{
公共静态集合类型
填写(收集类型、供应商类别、内部编号){
返回流生成(gen)
.限制(n)
.collect(colltype::new,colltype::add,colltype::addAll);
}
}
目标是生成
CollectionType
的实例,并使用gen
用n
项填充它。这种形式的collect()
确实实例化了一个新集合,但我不清楚该类型是否可以通过fill()
的参数列表传递。fill()
方法不必这样看,只要它实例化一个新集合并填充它并返回结果。您的想法是正确的,但您需要的是:
<T, C extends Collection<T>> C fill(Supplier<T> gen,
int n,
Supplier<C> factory) {
return Stream.generate(gen)
.limit(n)
.collect(factory, C::add, C::addAll);
}
C填充(供应商代、,
int n,
供应商工厂{
返回流生成(gen)
.限制(n)
.collect(工厂、C::添加、C::添加全部);
}
然后,您可以使用以下命令调用它:
HashSet<String> strings = fill(() -> "Foo", 10, HashSet::new);
HashSet strings=fill(()->“Foo”,10,HashSet::new);
这种技术被用于像4-arg版本的
收集器中。toMap()
实际上同样的操作是由收集器完成的。toCollection()
,所以。collect(toCollection(factory))
也可以使用。Brian,这样做看起来总是很简单。再次感谢。(不相关的便条)布莱恩-,如果你看一看,我将不胜感激(我一直在考虑自己回答,但我想你可能会感兴趣)