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

标签 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 的实例,并使用 genn 项填充它。这种形式的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);
}

然后你可以这样调用它:

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

此技术用于诸如 4-arg 版本的 Collectors.toMap() 之类的方法中。

关于Java 8 Stream.collect() 的通用使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34801965/

相关文章:

java - 由于名称冲突无法重写方法

java-8 - 如何在 drools 规则中定义和初始化变量

java - 用java获取网站的资源文件夹

java - 将带有 FloatProperty 的 ObjectProperty 绑定(bind)到其他属性

java - 类型不匹配 : cannot convert from List<SelectOption<Integer>> to List<SelectOption<String>>?

Java 泛型,未绑定(bind)通配符 <?> 与 <Object>

java - 为什么我不能将 Object 类型的对象添加到 List<?> 中?

java - 处理 java.lang.Number 子类操作的通用泛型方法

JavaFx 在 Raspberry Pi 上非常慢

java - 如何按需重新加载 com.google.common.base.Supplier 中的值