Java 8填充数组与供应商

gon*_*ard 23 java functional-programming java-8

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

我想写:

Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);
Run Code Online (Sandbox Code Playgroud)

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

Psh*_*emo 29

如果您想用来自供应商的数据填充现有数组,请参阅Stuart Marks发布的答案,或使用来自@ Hogler 评论的创意解决方案:

Object[] array = Stream.generate(supplier)
                       .limit(arraySize)
                       .toArray(); // will generate new *Object[]* array
Run Code Online (Sandbox Code Playgroud)

如果你没有创建填充了供应商生成的结果的新数组,你可以使用

String[] array  = Stream.generate(supplier)
                        .limit(10)
                        .toArray(String[]::new); //now *String[]* array will be returned
Run Code Online (Sandbox Code Playgroud)

对于不同类型比Object[]你可以使用toArray(IntFunction<YourType[]> generator);toArray(YourType[]::new)(再次学分 @Holger).

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

  • @gontard:为了生成`MyType`数组,使用`toArray(MyType [] :: new)` (5认同)
  • 作为评论,您可以使用以下"创意"方式填充现有数组:`Arrays.asList(array).replaceAll(x-> supplier.get());`.您甚至可以使用`subList`覆盖范围. (3认同)

Stu*_*rks 21

java.util.Arrays那里

<T> void Arrays.setAll(T[] array, IntFunction<T> generator)
Run Code Online (Sandbox Code Playgroud)

这不需要供应商; 相反,它IntFunction的输入参数是要填充的数组索引.如果您的对象不依赖于目标数组索引,则可以忽略该参数并按如下方式调用供应商:

Arrays.setAll(array, i -> supplier.get());
Run Code Online (Sandbox Code Playgroud)

基元数组以及引用类型数组都存在重载.parallelSetAll()除了并行之外,还有相应的一系列方法可以做同样的事情.(它在内部使用流.)