Java8使用供应商填充数组

Java8使用供应商填充数组,java,functional-programming,java-8,Java,Functional Programming,Java 8,有没有一种使用Java8填充数组的方法 我想写: Supplier<Object> supplier = () -> new Object(); Object[] array = new Object[size]; Arrays.fill(array, supplier); Supplier=()->new Object(); Object[]数组=新对象[大小]; 数组。填充(数组、供应商); 注: 我知道我可以编写自己的方法。您可以轻松编写自己的方法: public s

有没有一种使用Java8填充数组的方法

我想写:

Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);
Supplier=()->new Object();
Object[]数组=新对象[大小];
数组。填充(数组、供应商);
注:
我知道我可以编写自己的方法。

您可以轻松编写自己的方法:

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

publicstaticvoidfillarray(T[]数组,供应商Pshemo解决方案的替代方案您可以使用map方法

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

如果您想创建一个新数组填充供应商生成的结果,您可以使用

Object[] array = Stream.generate(supplier)
                       .limit(arraySize)
                       .toArray(); // will generate new *Object[]* array
对于不同于
Object[]
的类型,您可以使用
toArray(IntFunction generator);
类似于
toArray(您的类型[]:新建)
()

流还允许我们使用最“流行”的基本类型,即
int
long
double
。例如,我们可以使用
IntStream\toArray
创建
int[]
来保存
IntStream
中的元素以“填充”
IntStream
对于供应商提供的元素,我们可以使用
IntStream.generate(intSupplier)
like

int[] array = IntStream.generate(()->1)
                       .limit(5)
                       .toArray(); //returns `new Int[]{1,1,1,1,1}

如果您希望使用供应商提供的数据填充现有数组,请参见基于
数组的posted by。setAll(数组,供应商)
,它除了处理对象数组外,还支持一些基元类型的数组:
double[]
int[]
long[]

其他备选方案是使用以下创造性解决方案:

请注意Jon Skeet在中解释的基元类型数组存在的问题。


原语数组和引用类型数组都有重载。还有一个相应的方法系列
parallelSetAll()
,除了并行外,它也做同样的事情。(它在内部使用流。)

谢谢,但我应该在我的问题上更具体一些。我知道我可以用java编写方法。谢谢,这非常接近我要找的东西。我用
对象
给出了我的示例,但是如果我想使用另一种类型,如
整数
日期
?@gontard:要生成
MyType
的数组,请使用
toArray(MyType[]::new)
好的。你能在你的答案中添加这个选项吗?最后一个问题:可以对泛型类型做同样的事情吗?我知道创建泛型数组是不可能的,但可能是……作为一个注释,你可以用以下“创造性”方式填充一个已经存在的数组:
Arrays.asList(array).replaceAll(x->supplier.get());
。您甚至可以使用
子列表
覆盖一个范围。使用创造性的方法,您应该注意基本类型。第一个示例是确定的:
System.out.println(Arrays.asList(新整数[]{1,2,3,4,5}));
[1,2,3,4,5]
第二个示例是一个包含一个元素的列表,该元素是整个数组:
System.out.println(Arrays.asList(newint[]{1,2,3,4,5}));
[[I@53b32d7]
@Pshemo:我明白了。我以为他想要用相同的对象进行常规填充。在这个解决方案中,数组创建了两次。
int[] array = IntStream.generate(()->1)
                       .limit(5)
                       .toArray(); //returns `new Int[]{1,1,1,1,1}
Arrays.asList(array).replaceAll(x -> supplier.get()); 
//you can even overwrite a range using `subList`
<T> void Arrays.setAll(T[] array, IntFunction<T> generator)
Arrays.setAll(array, i -> supplier.get());