Is there a way to fill an array using java 8 Supplier
?
I would like to write:
Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);
Note: I know i could write my own method.
In case you want to create new array filled with results generated by Supplier you can use
Object[] array = Stream.generate(supplier)
.limit(arraySize)
.toArray(); // will generate new *Object[]* array
For different types than Object[]
you can use toArray(IntFunction<YourType[]> generator);
like toArray(YourType[]::new)
(credits to @Holger).
String[] array = Stream.generate(supplier)
.limit(10)
.toArray(String[]::new); //now *String[]* array will be returned
Streams also allow us to work with most "popular" primitive types which are int
long
and double
. For instance we can use IntStream#toArray
to create int[]
holding elements from IntStream
. To "fill" IntStream
with elements from supplier we can use IntStream.generate(intSupplier)
like
int[] array = IntStream.generate(()->1)
.limit(5)
.toArray(); //returns `new Int[]{1,1,1,1,1}
In case when you want to fill already existing array with data from Supplier see answer posted by Stuart Marks based on Arrays.setAll(array, supplier)
which aside from handling arrays of objects also supports some arrays of primitive types: double[]
int[]
and long[]
.
Other alternative is to use creative solution from @Hogler's comment:
Arrays.asList(array).replaceAll(x -> supplier.get());
//you can even overwrite a range using `subList`
just be aware that Arrays.asList
is designed to work with arrays of reference type (non-primitive ones), so it will not handle "properly" arrays like int[]
as explained by Jon Skeet in answer: https://stackoverflow.com/a/1467940.