有没有办法使用java 8 Supplier
填充数组?
我想写:
Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);
注意: 我知道我可以写自己的方法。
答案 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)
<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();