Java8使用供应商填充数组
有没有一种使用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
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());