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,这样做看起来总是很简单。再次感谢。(不相关的便条)布莱恩-,如果你看一看,我将不胜感激(我一直在考虑自己回答,但我想你可能会感兴趣)