Java 8 Stream.collect()的通用用法

时间:2016-01-14 23:49:21

标签: 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<T> gen, int n) {
        return Stream.generate(gen)
            .limit(n)
            .collect(colltype::new, colltype::add, colltype::addAll);
    }
}

目标是生成CollectionType的实例,并使用n将其填充gen个项目。这种形式的collect()会实例化一个新的集合,但我不清楚该类型是否可以通过fill()的参数列表传递。 fill()方法不必完全按照这种方式查看,只要它实例化一个新集合并填充它并返回结果。

1 个答案:

答案 0 :(得分:5)

你有正确的想法,但你想要的是:

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

然后你可以用:

来调用它
HashSet<String> strings = fill(() -> "Foo", 10, HashSet::new);

此技术用于Collectors.toMap()的4-arg版本等方法。