Java 8填充数组与供应商

时间:2014-08-01 09:36:50

标签: java functional-programming java-8

有没有办法使用java 8 Supplier填充数组?

我想写:

Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);

注意: 我知道我可以写自己的方法。

4 个答案:

答案 0 :(得分:28)

如果您想使用来自供应商的数据填充 现有数组 ,请参阅answer发布的Stuart Marks,或使用来自@Hogler's comment的广告解决方案:

Arrays.asList(array).replaceAll(x -> supplier.get()); 
//you can even overwrite a range using `subList`

如果 创建新数组 没有问题,请填写供应商生成的结果,您可以使用

Object[] array = Stream.generate(supplier).limit(arraySize).toArray();
//                                    will return new array ^^^^^^^ 

对于Object以外的其他类型,您可以使用toArray(IntFunction<YourType[]> generator); toArray(YourType[]::new)credits again to @Holger)。

String[] array  = Stream.generate(supplier).limit(10).toArray(String[]::new);

答案 1 :(得分:19)

java.util.Arrays中有

<T> void Arrays.setAll(T[] array, IntFunction<T> generator)

这不需要供应商;相反,它需要一个IntFunction,其输入参数是要填充的数组索引。如果您的对象不依赖于目标数组索引,您可以忽略该参数并调用这样的供应商:

Arrays.setAll(array, i -> supplier.get());

基元数组和引用类型数组都有重载。除了并行之外,还有相应的方法系列parallelSetAll()执行相同的操作。 (它在内部使用流。)

答案 2 :(得分:-1)

您可以轻松编写自己的:

public static <T> void fillArray(T[] array, Supplier<? extends T> supplier) {
    for(int k = 0; k < array.length; k++)
        array[k] = supplier.get();
}

答案 3 :(得分:-2)

替代Pshemo的解决方案,您可以使用map方法。

Object[] array = new Object[size];
array = Arrays.stream(array).map(a -> new Object()).toArray();